Gists

PInvoke

PInvoke 既 Platform Invocation Services 平台调用服务,允许你使用 C# 之类的语言调用外部函数。比如,许多硬件中,其驱动是用 C/C++ 写的,而用 C# 在外面再套一层壳子来管理界面(WPF/Winform)。这时,可以使用 PInvoke 方法让 C# 去调用动态链接库中的函数。

PInvoke

PInvoke 既 Platform Invocation Services 平台调用服务,允许你使用 C# 之类的语言调用外部函数。比如,许多硬件中,其驱动是用 C/C++ 写的,而用 C# 在外面再套一层壳子来管理界面(WPF/Winform)。这时,可以使用 PInvoke 方法让 C# 去调用动态链接库中的函数。

《手把手教你PInvoke》

可以在 C# 中使用 DLLImport 标记链接库并引入其中函数。

public class Win32
{
    [DllImport("user32.dll")]
    public static extern IntPtr MessageBox(
      int hWnd,
      String text,
      String caption,
      uint type
    );
}
class Program
{
    static void Main(string[] args)
    {
        Win32.MessageBox(0, "Hello, World", "Hi~", 0);
        Console.ReadLine();
    }
}

如果不知道有什么方法可以用、方法对应哪个动态链接库以及参数是啥,都可以上官方文档中找,里面有函数作用及签名等详细的说明。也可以到 pinvoke.net 找到已经汇总好的代码。

《使用PInvoke互操作,让C#和C++愉快的交互优势互补》

介绍了如何使用 Visual Studio 创建一个 C++ 动态链接库并在 C# 中调用。

要了解托管代码和非托管代码的函数签名的类型转换,可以查阅官方文档。

如果碰到复杂类型,可以使用 PInvoke Interop Assistant 工具自动转换代码。

此外,在 C++ 中,可以通过函数指针直接接受来自 C# 的委托函数,十分令人愉快。


Copyright © 2024 Lionad - CC-BY-NC-CD-4.0