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

时间:2015-05-14 06:48:01

标签: c# c++ dll import dllimport

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

如果需要本机lib中的自定义类,则可能需要导出类型库或使用托管C ++编写包装器。你有效地尝试做的是整理从本机到托管的一段内存,现在必须处理数据类型的编组方式。

如果可能的话,我实际上会建议尝试取消编组,因为它工作时很好,但是当它中断时,它可能会引起调试。

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

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

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

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

答案 1 :(得分:1)

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

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

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