C# 代码无法"see"我的C++ dll 中的方法

C# code can't "see" the methods in my C++ dll

本文关键字:dll 方法 C++ see 代码 我的      更新时间:2023-10-16

我有一个用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'(你是否缺少使用指令或程序集引用?)

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

谢谢!

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

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

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

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

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

  1. 将 C++ 类包装在托管 C++ 类中
  2. 使用名为 SWIG 的库

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