如何在C#中使用DllImport接口?

问题描述:

我的代码中有几个DllImport s,相对于user32.dll,我认为他们是在一个接口中声明的。但是,那给我错误说public,static,extern不适用于每个项目。如何在C#中使用DllImport接口?

实施例接口代码如下:

public interface IWindowsFunctions 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int MessageBox(int hWnd, string msg, string title, uint flags); 
} 

是否有一个界面使用此的任何特定方式,或者是有一个替代或者是不可能与接口?

感谢

+1

其他的答案已经说明这是不可能把这些定义中的接口。但我的问题是,为什么你想在一个界面中做到这一点? – 2011-04-05 07:46:41

好吧,它已被多次提到,DLLImport是一个实现,因此无法在接口上定义,但我认为它仍然值得一提,我通常将DLLImport按照“NativeMethods”类进行分组组织,像这样:

internal static class NativeMethods 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern int MessageBox(int hWnd, string msg, string title, uint flags); 
} 

使用例:

NativeMethods.MessageBox(myWnd, "Hello World", "Hello", flags); 
+1

+1使用推荐的指南(NativeMethods作为类名和内部作为访问者) – 2011-04-05 07:39:54

+0

@ClausJørgensen:看起来我必须重构我的代码。顺便说一句,这些指南在哪里? – BoltClock 2011-04-05 07:44:21

+1

http://msdn.microsoft.com/en-us/library/ms182161.aspx – 2011-04-05 07:46:08

它已经实施 - 实施以user32.dll找到。这是什么extern关键字表示:

的extern修饰符用于声明在外部实现的方法。

接口只能为其实现者声明实例方法;因此static关键字在这里也是无效的。

最后,一个接口不能声明实现;只有它的执行者才可以。在这种情况下,由于实现已经存在,因此为它创建接口是没有意义的。

如果您希望为非托管调用创建包装类,请参阅Kragen's answer

+0

那么有没有其他的方法呢? – 2011-04-05 07:23:47

+0

@dia:我更新了我的答案。 – BoltClock 2011-04-05 07:25:41

+0

非常感谢您的回答... – 2011-04-05 08:00:20

接口方法不能有可访问性修饰符,这意味着你不能对它们应用任何静态/外部/公共/私人/等装饰器。

我不明白你为什么要为此使用接口;它是非标准的,按照惯例,DllImport方法是实现,它不属于接口。

相反,你可以使用一个静态类,甚至一个结构。

你不能那样做。一个DllImport大约是实现,并且一个接口没有说明实现。另外,C#没有静态接口的概念。

您可以使用正确的签名创建接口,并创建一个实现该接口的类(如果需要)。

+0

由于标记为DllImport的方法必须是静态和外部的,并且实现接口的方法不能是静态的,所以不能“创建具有正确签名的接口并创建实现该接口的类,如果需要的话”。 – sohum 2011-09-19 16:15:50