在C#中使用C ++库时遇到问题

时间:2016-03-07 01:50:09

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

所以我正在编写这个使用C ++编写的第三方DLL的程序。我想用C#编写程序,因为我对这门语言知道了一两件事,我从未在C ++中做过任何事情。
我在一组文件中得到了名为CIUsbLib的库:.dll,.h,.lib,.ext。该程序适用于目标计算机(Win7 32位),与我正在开发的不同(Win10和Win8都是64位) - 我对目标计算机的访问权限有限。我正在使用Visual Studio 2015,根据VS的对象浏览器,DLL包含一些类,我想使用几种方法 我发现有三种方法可用 - 引用C#项目中的库,P / Invoke(使用DllImport)和C ++ / CLI包装器。

所以我首先尝试在我的C#项目中引用该库,但它在两台开发计算机上实例化类时直接崩溃,并在目标计算机上抛出AccessViolationException。我无法弄清楚它为什么会发生,但我把它归咎于图书馆的代码是不受管理的。

经过一些研究后,我发现DllImport不能用于类中关闭的方法。所以我尝试了C ++ / CLI包装器,但很快意识到在Visual C ++ CLR项目中引用C ++库会将“Interop.CIUsbLib.1.0.dll”库添加到引用中,这显然是托管的。在

namespace CIUsbLib_wrap
{

public ref class CIUsbLib_wrapper
{
    CHostDrv* wrap_class;
public:
    CIUsbLib_wrapper() { wrap_class = new CHostDrv};

};
}

Visual Studio在星号上显示错误,表示该类已经是C ++ / CLI。显然我正在尝试包装已经包装的库。 VS会自动创建一个隐式包装器,阻止我编写自己的包装器吗?

在我尝试这个之后,我注意到在CLR项目的VS对象浏览器中查看时,库内容是不同的: DLL in CLR project 当在C#项目中查看时: DLL in C# project。 在第一张图片中,CHostDrv和IHostDrv是接口类,CHostDrvClass是ref类;在另一张图片中,CHostDrv是接口,CHostDrv是类。我不明白,为什么会有所不同?

所以我看到了两种找到解决方案的方法:

  • 找出为什么实例化库的类会在目标计算机上抛出AccessViolationException并在其他计算机上崩溃该程序
  • 为CIUsbLib.dll创建包装器,而不是为Interop.CIUsbLib.1.0.dll创建包装器
  • 别的什么?

欢迎任何帮助,因为如果我找不到解决方案,我将不得不用C ++编写程序,这真的很糟糕。

0 个答案:

没有答案