我的代码中DllImport
有几个user32.dll
,我认为它们是在接口中声明的。但这会让我误以为public
,static
,extern
对每个项目无效。
示例接口代码如下:
public interface IWindowsFunctions
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int MessageBox(int hWnd, string msg, string title, uint flags);
}
在界面中是否有任何特定的方法可以使用它,或者是否有替代方法或接口不可能?
谢谢
答案 0 :(得分:10)
现在已经多次提到它已经多次提到DLLImport是一个实现,因此无法在接口上定义,但我认为仍然值得一提的是,通常我将DLLImports分组为“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 :(得分:4)
它已经实现 - 实现可以在user32.dll
中找到。这就是extern
关键字的含义:
extern 修饰符用于声明外部实现的方法。
接口只能为其实现者声明实例方法;因此,static
关键字在此处无效。
最后,接口无法声明实现;只有它的实现者可以。在这种情况下,由于实现已经存在,因此为它创建接口是没有意义的。
如果您要为非托管呼叫创建包装类,请参阅Kragen's answer。
答案 2 :(得分:1)
接口方法不能具有辅助功能修饰符,这意味着您不能将任何静态/外部/公共/私有/等装饰器应用于它们。
我不明白你为什么要使用这个接口;它是非标准的,按照惯例,DllImport
方法是实现,它不属于接口。
相反,您可以使用静态类,甚至是结构。
答案 3 :(得分:1)
你做不到。 DllImport是关于实现,并且接口没有说明实现。此外,C#没有静态interfasces的概念。
您可以创建具有正确签名的接口,并根据需要创建实现该接口的类。