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

时间:2011-04-05 07:08:28

标签: c# interface dllimport

我的代码中DllImport有几个user32.dll,我认为它们是在接口中声明的。但这会让我误以为publicstaticextern对每个项目无效。

示例接口代码如下:

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

在界面中是否有任何特定的方法可以使用它,或者是否有替代方法或接口不可能?

谢谢

4 个答案:

答案 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的概念。

您可以创建具有正确签名的接口,并根据需要创建实现该接口的类。