C++/大型C库的CLI或C#P/Invoke,调用外部函数 现在我知道有很多问题,但一般来说,它们是指C++库。< /P>

C++/大型C库的CLI或C#P/Invoke,调用外部函数 现在我知道有很多问题,但一般来说,它们是指C++库。< /P>,c,dll,c++-cli,pinvoke,C,Dll,C++ Cli,Pinvoke,我有一个相当重要的C dll(大约2800个函数),我需要为其中70个在C#中可调用的函数制作一个API。我开始使用P/Invoke,但它相当乏味,因为我有复杂的结构要从C代码中传递和返回(带有指向其他代码的指针、双指针等的结构),而且要花很多时间才能得到我需要的东西 现在我不知道C++ + CLI,但是我有一些C++的经验(虽然不是很多)。 我想知道为我的项目努力学习这一点是否值得。将使用C++包装器使我不必与编组结构、分配全局堆中的指针等是否斗争?……/P> 非常感谢这个伟大的社区这是一个相

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

现在我不知道C++ + CLI,但是我有一些C++的经验(虽然不是很多)。 我想知道为我的项目努力学习这一点是否值得。将使用C++包装器使我不必与编组结构、分配全局堆中的指针等是否斗争?……/P>
非常感谢这个伟大的社区

这是一个相当大的表面积。我认为C++/CLI将比P/invoke更容易。你不需要使用任何C++特性,你可以编写C语言,编译并用C++ + CLI导出。因此,编写C++/CLI包装器更容易。您可以将这些结构转换/包装为
ref类
,而无需太多麻烦,并在C#中使用它们


谢谢为了确保您理解,我需要做的是在C++/CLI中编译当前的dll?一旦我有了这些,就可以在C#中使用了吗?或者我需要写C++类吗?我读到的关于C++和CLI包装的文章都提到为每个现有C++类创建一个类…因为我没有课,所以我不知道该怎么办。。。如果你有一个教程或例子,这将是伟大的!是的,@Ben说的也很好。如果您的C DLL被应用程序的其他部分使用,那么您可能希望保留它。否则,最好将对象直接链接到C++/CLI代码中。@Nchekwube:链接一个.lib文件,该文件包含C函数的对象代码,或者是一个导入库,告诉编译器如何在运行时在DLL中查找这些函数。当您构建C代码时,链接器应该在DLL旁边生成一个导入库。当使用C头文件时,您很可能需要
extern“C”{#include“Ccode.h”}
,否则名称混乱将导致问题。哇,好吧。。。谢谢你的帮助。总而言之:我有一个C dll。
extern“C”{}
已经在其中,用于导出函数。现在,如何在visual Studio c++/cli库项目中进行链接?
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);