导入C++;将自定义库函数转换为C# 我现在有一个大的C++库,我需要把它加入到一个C项目中。我成功地使用DllImport从我的库中访问了一些函数,如下所示: [DllImport("MyLib.dll")] public static extern int SampleFunction(string param);

导入C++;将自定义库函数转换为C# 我现在有一个大的C++库,我需要把它加入到一个C项目中。我成功地使用DllImport从我的库中访问了一些函数,如下所示: [DllImport("MyLib.dll")] public static extern int SampleFunction(string param);,c#,c++,dll,import,dllimport,C#,C++,Dll,Import,Dllimport,但是,我似乎不知道如何使其适用于具有参数或返回类型的函数,这些参数或返回类型未在dll本身中定义(即,dll中的代码将其从另一个文件导入),例如,此示例函数包含一个列表: [DllImport("MyLib.dll")] public static extern std::vector<MyClass> MyFunction(string param); [DllImport(“MyLib.dll”)] 公共静态外部std::vector MyFunction(字符串参数); 对

但是,我似乎不知道如何使其适用于具有参数或返回类型的函数,这些参数或返回类型未在dll本身中定义(即,dll中的代码将其从另一个文件导入),例如,此示例函数包含一个列表:

[DllImport("MyLib.dll")]
public static extern std::vector<MyClass> MyFunction(string param);
[DllImport(“MyLib.dll”)]
公共静态外部std::vector MyFunction(字符串参数);

对于std库函数,我知道我可以获取dll并将其导入,但是上面示例中的其他类(如MyClass)呢?是否需要在C++中为每个类创建托管包装类,或者是否有其他方式来实现这一点?

< P>如果您需要从本地LIB中创建自定义类,则可能需要导出类型库或使用托管C++编写包装器。实际上,您要做的是将一段内存从本机封送到托管,现在必须处理如何封送数据类型

如果可能的话,我实际上会建议尝试取消封送处理,因为当它工作时是可以的,但当它中断时,可能会导致调试失败

无论如何,我实际上不确定STL中的任何内容是否可以被封送。至少,我从未见过这样做。更多的时候,我不得不做这样的转换:

如果要封送一个实际的类,到目前为止,我使用的标准方法是通过类型库:

或将本地LIB链接到托管C++类,然后将托管C++ DLL引用为C Sym项目作为垫片。

除了此之外,如果您可以将类转换为严格的C样式函数并传递一个Syt,这可以允许您只使用pPoNKE,这与简单地导出一堆辅助函数没有什么不同,除了您可以来回排列结构表示:

<代码> STD::vector < /C> >,或者实际上是任何非托管C++类,无法用于与C#的互操作。事实上,即使您希望从另一个非托管C++模块中消费这个函数,您也必须确保使用与DLL相同的编译器和动态运行时函数。 您需要找到其他方法来实现此功能。有很多不同的方法可以做到这一点

  • 您可以向该功能公开一个p/invoke接口。这可能需要声明一个结构来表示类的数据,并在该结构之间进行序列化
  • <>你可以考虑一个COM接口,但是它不能提供比P/Unjk更大的优势。您仍然需要序列化类
  • C++/CLI包装器将是另一种选择。您可以使用托管C++/CLI类包装非托管类,然后从C#使用该类

你说的“其他课程”是什么意思?
MyClass
在哪里定义?这是一个C++类还是.NET类?关于标准库,“我知道我可以得到DLL并导入它”——你可能会在这方面受到一种粗暴的觉醒。C++标准库可能不是你所想的那样。你的C++ DLL是在.NET中写的吗?对不起,我应该澄清。代码> MyClass <代码>是一个C++类,它来自C++ > MyLIB .DLL< /C>。这就是为什么我想知道我是否需要编写一个托管类来包装它使用的每个类,这样我就可以从我的C#项目中调用托管代码。我想我看到了MSDN上的一个例子,在那里他们从C++标准库中导入了一些函数,比如“代码> Posie/Cuth>”,所以我试图再次找到那个页面。<代码> dLimPult实际上只是为了导入C样式函数。如果你想用C++来交互,你最好的办法是使用C++ /CLI包装库——你可以直接用.NET和C++来工作。哦,避免使用这样的返回值——这并不能明确谁负责内存——记住,非托管代码中的互操作比托管代码中的要困难得多。除非你有充分的理由不这么做,否则我只会坚持使用简单的C风格函数。