繁体   English   中英

C#代码无法“查看”我的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'(您是否缺少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#项目中使用c ++代码,您有2个选择:

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

一个您可能感兴趣的链接: 用C#包装Visual C ++

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM