C#代码无法“看到”我的C ++ DLL中的方法

我有一个用C ++编写的代码(我没有编写)并希望在C#中使用它,所以我决定创建一个dll并从那里使用这个类。

我对C ++知之甚少,并且在我的C#项目中引用这个类的方法时遇到了问题。

C ++代码是这样的:

#ifndef BeamAn_class #define BeamAn_class #define DllExport __declspec( dllexport ) #include  #include  using namespace std; public class DllExport BeamAn { public: BeamAn(); ~BeamAn(); bool SetGeometry(vector); //I didn't put the DllExport here because I already did it for the whole class. It's okay to do this, right? //other public methods an stuff private: //private methods an stuff } #endif 

在我的C#项目中,我通常添加了对C ++ dll的引用(右键单击项目,添加引用。.lib和.h文件位于dll的同一文件夹中)。

但看起来Visual Studio无法“看到”我class级的方法。 我可以创建BeamAn类型的对象,但不能使用它的任何方法。 例如,我可以这样做:BeamAn contBeam = new BeamAn(); 但不能使用类中的任何方法或属性,如下所示:contBeam.SetLoadFactors(1.0,1.2);

Visual Studio说“BeamAn不包含’SetLoadFactors’的定义,并且没有扩展方法’SetLoadFactors’接受第一个参数类型’BeamAn’可以找到(你是否缺少using指令或汇编引用?)

我是否应该在C ++代码中编写更多内容以使dll正常工作,或者在引用它时我做错了什么? 我知道如果我是明确的链接,我必须在我的C#代码中使用“DllImport”,但这不是我想要做的。

非常感谢你!

有几种方法可以在C#中使用C ++库。

  1. 使用PInvoke – 直接调用您的C ++代码。 有关更多信息,请参阅此文章 。 另请参阅pinvoke.net以获取一般参考。
  2. 使用互操作语言围绕非托管代码创建托管包装。 如果您在Microsoft世界中,我建议使用C ++ / CLI来创建混合模式库(包含托管代码和非托管代码的dll)。 这是一篇介绍C ++ / CLI的简短(和旧)文章。
  3. 使您的C ++ COM可访问。 由于代码不是你的,这个可能对你没用。 有关C ++和COM的更多信息,请参阅此文章 。

对于简单的场景,PInvoke可能是最简单的。 对于托管代码和非托管代码的更复杂的交互,我建议使用互操作语言编写混合模式dll。 如果那些不适合你,请使用COM。

为了解决您收到的错误:您无法从C#项目添加对C ++库的引用 – 它们是完全不同的语言,具有不同的内存管理系统,不同的类型系统,不同的所有内容(以及很多内容)。 此外,您无法将数据结构(如矢量,映射或集)从非托管代码传递到托管代码。

要在ac#project中使用c ++代码,您有两个选择:

  1. 将您的c ++类包装在托管的c ++类中
  2. 使用名为swig的库

您可能感兴趣的链接: 在C#中包装Visual C ++