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

时间:2012-04-16 02:39:52

标签: c# c++ visual-studio-2010 dll

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

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

C ++代码是这样的:

#ifndef BeamAn_class
#define BeamAn_class
#define DllExport   __declspec( dllexport ) 
#include <vector>
#include <cmath>

using namespace std;

public class  DllExport BeamAn
{
  public:
    BeamAn();
    ~BeamAn();  
    bool SetGeometry(vector<double>); //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无法“看到”我班级的方法。我可以创建BeamAn类型的对象,但不能使用它的任何方法。 例如,我可以这样做: BeamAn contBeam = new BeamAn(); 但不能使用类中的任何方法或属性,如下所示:contBeam.SetLoadFactors(1.0,1.2);

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

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

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

  1. 使用PInvoke - 直接调用您的C ++代码。有关详细信息,请参阅this article。另请参阅pinvoke.net以获取一般参考。
  2. 使用互操作语言围绕非托管代码创建托管包装。如果您在Microsoft世界中,我建议使用C ++ / CLI来创建混合模式库(包含托管代码和非托管代码的dll)。 Here是一篇介绍C ++ / CLI的简短(和旧)文章。
  3. 使您的C ++ COM可访问。由于代码不属于您,因此对您来说可能没用。有关C ++和COM的更多信息,请参阅this post
  4. 对于简单的场景,PInvoke可能是最简单的。对于托管代码和非托管代码的更复杂的交互,我建议使用互操作语言编写混合模式dll。如果那些不适合你,请使用COM。

    要解决您收到的错误:您无法从C#项目添加对C ++库的引用 - 它们是完全不同的语言,具有不同的内存管理系统,不同的类型系统,不同的一切(嗯,很多东西) )。此外,您无法将数据结构(如矢量,地图或集合)从非托管代码传递到托管代码。

答案 1 :(得分:0)

在c#项目中使用c ++代码,你有两个选择:

  1. 将您的c ++类包装在托管c ++类中
  2. 使用名为swig的库
  3. 您可能感兴趣的链接:Wrapping Visual C++ in C#

相关问题