我目前有一个大型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 ++中为每个类创建托管包装类,还是有其他方法可以做到这一点?
答案 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相同的编译器和动态运行时。
您需要找到其他方法来实现此功能。有很多不同的方法可以做到这一点。