1

我有一个用 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 指令或程序集引用?)

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

非常感谢!

4

2 回答 2

2

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

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

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

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

于 2012-04-16T03:10:21.707 回答
0

要在 ac# 项目中使用 c++ 代码,您有 2 个选项:

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

您可能感兴趣的链接:Wrapping Visual C++ in C#

于 2012-04-16T02:44:16.760 回答