将 C++ 自定义库函数导入 C#

Importing C++ custom library functions into C#

我目前有一个大型 C++ 库,我需要将其合并到 C# 项目中。我成功地使用 DllImport 访问了我的库中的某些函数,如下所示:

[DllImport("MyLib.dll")]
public static extern int SampleFunction(string param);

但是,我似乎无法弄清楚如何使其适用于具有未在 dll 本身中定义的参数或 return 类型的函数(即 dll 中的代码从另一个文件导入它),例如这个接受列表的示例函数:

[DllImport("MyLib.dll")]
public static extern std::vector<MyClass> MyFunction(string param);

对于 std 库函数,我知道我可以获取 dll 并将其导入,但是其他 class 类如上例中的 MyClass 呢?我是否需要在 C++ 中为这些 class 中的每一个创建一个托管包装器 class,或者是否有其他方法可以做到这一点?

如果您需要来自本机库的自定义 class,您可能需要导出类型库或使用托管 C++ 编写包装器。您实际上正在尝试做的是将一块内存从本机编组到托管,现在必须处理数据类型的编组方式。

如果可能的话,我实际上会建议尝试取消封送处理,因为当它工作时它很好,但当它中断时,它可能会引发调试。

无论如何,我实际上不确定是否可以对 STL 中的任何内容进行编组。至少,我从未见过它完成。更多时候,我不得不像这样进行转换:How can I marshall a vector<int> from a C++ dll to a C# application?

如果你想整理一个实际的 class,到目前为止我完成它的标准方法是通过类型库:Import TLB into C#

或者通过将本机库链接到托管 C++ class,然后将托管 C++ dll 作为垫片引用到 C# 项目中。

除此之外,如果您可以将 class 转换为严格的 C 风格函数并传递一个结构,那么您就可以只使用 pinvoke,这与简单地导出一堆 helper 没有什么不同功能除了你可以来回编组结构表示:Marshal C++ struct array into C#

std::vector<MyClass>,或者实际上任何非托管 C++ class,都不能用于与 C# 的互操作。事实上,即使您希望从另一个非托管 C++ 模块使用此函数,您也必须确保您使用与导出该函数的 DLL 相同的编译器和动态运行时。

您需要找到一些其他方法来实现此功能。有很多不同的方法可以做到这一点。

  • 您可以向该功能公开一个 p/invoke 接口。这可能涉及声明一个结构来表示您的 class 的数据,并序列化到该结构和从该结构进行序列化。
  • 您可以考虑使用 COM 接口,但它不会提供比 p/invoke 更大的优势。您仍然需要序列化您的 class.
  • C++/CLI 包装器是另一种选择。您将使用托管 C++/CLI class 包装非托管 class,然后从 C# 使用它。