现在我知道有很多关于此的问题,但一般来说它们都是指c ++库。
我有一个相当重要的C dll(大约2800个函数),我需要在C#中为大约70个这些可调用函数创建一个API。我开始使用P / Invoke,但它非常繁琐,因为我有复杂的结构来传递和返回C代码(带有指针的结构,双指针等等),它花了我很多时间来得到我需要的东西。 / p>
现在我根本不了解C ++ / CLI,但我对C ++有一些经验(尽管不是很多)。
我想知道是否值得努力为我的项目学习这个。使用C ++包装器是否会让我不必为编组结构而烦恼,在全局堆中分配指针等等?....
非常感谢这个伟大的社区
答案 0 :(得分:6)
这是一个相当大的表面积。我认为C ++ / CLI比P / invoke更容易。您不需要使用任何C ++功能,您可以编写基本上是C的内容并使用C ++ / CLI编译和导出它。
答案 1 :(得分:3)
很难处理来自C#的原生结构。因此编写C ++ / CLI包装器更容易。您可以将这些结构转换/包装到ref classes
而不会有太多麻烦,并在C#中使用它们。
void some_function(Some_Struct * ss)
{
//...
}
struct Some_Struct
{
int intVal;
double dblVal;
}
//C++/ClI
public ref class Wrapper
{
public:
void CallSomeFunction(int intval, double doubleval)
{
Some_Struct * ss = new Some_Struct(); // maybe malloc is more appropriate.
ss->intVal = intval;
ss->dblVal = doubleval;
some_function(ss);
delete ss; // or Free(ss);
}
}
//C#
Wrapper wrapper = new Wrapper();
wrapper.CallSomeFunction(10,23.3);