C ++ / CLI或C#P / Invoke用于大型C库,调用extern函数

时间:2011-09-14 15:15:15

标签: c dll c++-cli pinvoke

现在我知道有很多关于此的问题,但一般来说它们都是指c ++库。

我有一个相当重要的C dll(大约2800个函数),我需要在C#中为大约70个这些可调用函数创建一个API。我开始使用P / Invoke,但它非常繁琐,因为我有复杂的结构来传递和返回C代码(带有指针的结构,双指针等等),它花了我很多时间来得到我需要的东西。 / p>

现在我根本不了解C ++ / CLI,但我对C ++有一些经验(尽管不是很多)。

我想知道是否值得努力为我的项目学习这个。使用C ++包装器是否会让我不必为编组结构而烦恼,在全局堆中分配指针等等?....

非常感谢这个伟大的社区

2 个答案:

答案 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);