C ++ / CLI或C#P /调用一个大的C库,调用一个extern函数

现在我知道有很多关于这个问题的问题,但总的来说,它们是指c ++库。

我有一个相当重要的C DLL(大约2800个函数),我需要为C#中约70个可调用的API制作一个API。 我开始使用P / Invoke,但它非常乏味,因为我有复杂的结构传递并从C代码返回(带有指向其他指针的结构,双指针等),并且我花了很多时间来获得所需的东西。

现在我完全不知道C ++ / CLI,但是我对C ++有一些经验(虽然不是很多)。

我想知道是否值得为我的项目学习这一点。 将使用C ++包装使我不必与编组结构斗争,分配全局堆中的指针,等等或不?

非常感谢这个伟大的社区


很难处理来自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);

这是相当大的表面积。 我认为C ++ / CLI比P / invoke更容易。 您不需要使用任何C ++功能,您可以编写基本上为C的内容,并使用C ++ / CLI编译和导出它。

链接地址: http://www.djcxy.com/p/59851.html

上一篇: C++/CLI or C# P/Invoke for a big C library, calling an extern function

下一篇: Secondary axis with twinx(): how to add to legend?