C# 代码无法"see"我的C++ dll 中的方法
C# code can't "see" the methods in my C++ 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'(你是否缺少使用指令或程序集引用?)
我是否应该在C++代码中编写更多内容以使 dll 正常工作,或者我在引用它时做错了什么?我知道如果我是显式链接,我必须在我的 C# 代码中使用"DllImport",但这不是我想要做的。
谢谢!
有几种方法可以使C++库在 C# 中可用。
- 使用 PInvoke - 直接调用您的C++代码。有关详细信息,请参阅此文章。另请参阅 pinvoke.net 以供一般参考。
- 使用互操作语言围绕非托管代码创建托管包装器。如果你在Microsoft世界,我建议C++/CLI 创建混合模式库(同时包含托管和非托管代码的 dll)。这是一篇介绍 C++/CLI 的简短(和旧)文章。
- 使C++ COM 可访问。由于代码不是您的,因此此代码可能对您没有用。有关C++和 COM 的详细信息,请参阅此帖子。
对于简单的场景,调用可能是最简单的。对于托管和非托管代码的更复杂的交互,我建议使用互操作语言编写混合模式 dll。如果这些不适合你,请使用 COM。
要解决您收到的错误:您无法从 C# 项目添加对C++库的引用 - 它们是完全不同的语言,具有不同的内存管理系统、不同类型的系统、不同的一切(嗯,很多东西)。此外,不能将数据结构(如矢量、映射或集)从非托管代码传递到托管代码。
若要在 C# 项目中使用 C++ 代码,您有 2 个选项:
- 将 C++ 类包装在托管 C++ 类中
- 使用名为 SWIG 的库
您可能感兴趣的链接:在 C# 中包装视觉C++
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- 创建一个C++DLL以从C#DLL调用方法
- 在 c++ 中创建 dll 并在 delphi 中调用的标准方法
- 努力使用 C# 从本机 DLL 调用该方法
- Java 调用 dll 字符串返回类型方法
- 我们如何从 C# 中的 DLL 中获取C++所有方法?
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 显式链接 DLL 和类方法
- 从C#调用C DLL方法
- 是否可以使用 Excel::_Application::Run 调用 C# dll 方法
- 如何从 JAVA 程序中访问文件中定义的类.DLL方法
- 当从一个应用程序调用时,在DLL方法中创建COM接口指针是有效的,但当从另一个应用软件调用时则无效
- 使用C++从Windows应用程序向dll方法传递字符串
- 如何解决调用 dll 方法时的访问冲突写入位置
- 将 dll 方法从C++导出到 C#。为什么我需要:" extern " C " "
- 当c#程序试图在c++ dll方法中使用cudaMalloc分配超过2GB时终止
- 访问dll方法时的访问冲突读取位置
- 使用JNA从Java调用c++ dll方法并避免方法名称混淆
- 代理dll:方法覆盖/方法转发(COM实现继承)