在c#中使用c ++库

时间:2009-04-21 10:56:09

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

嘿伙计们,我正在尝试在我的c#项目中包含c ++库(DLL),但每次我这样做,我都会在VS2008中收到以下错误信息,有什么建议吗?

编辑:这是一个C ++ MFC DLL


Microsoft Visual Studio

无法添加对“C:\ Users \ cholachaguddapv \ Desktop \ imaging.dll”的引用。请确保该文件是可访问的,并且它是有效的程序集或COM组件。

5 个答案:

答案 0 :(得分:18)

如果它是“普通”DLL(不是COM,不是托管C ++),则无法添加这样的引用。您必须为要在DLL中调用的导出添加p / invoke签名(外部静态方法定义)。

[DllImport("yourdll.dll")]
public static extern int ExportToCall(int argument);

查看在线帮助中的DllImport属性。

答案 1 :(得分:5)

如果它是一个直接的C ++库,那么就不可能以这种方式引用它。

您有两个选择,可以将C ++库编译为程序集,使用C ++ / CLI包装器公开非托管代码。

-OR -

如果库通过C API公开它的功能,你可以使用一些p / invoke调用。

您是否可以稍微扩展一下这个问题,以包含有关您通常如何从c ++调用imaging.dll的一些细节?

答案 2 :(得分:3)

如果是非托管dll,则无法添加对它的引用。 你必须使用pinvoke或类似的东西来调用它:

public classFoo

{

[DllImport("myunmanaged.dll", CharSet = CharSet.Ansi)]

private extern static int UnmanagedFunction(int type, int dest);

}

如果您想将其转换为托管dll,请查看此处: http://msdn.microsoft.com/en-us/library/aa446538.aspx

如果您想了解更多有关pinvoke和dllimport的信息,请点击此处: http://msdn.microsoft.com/en-us/library/aa288468.aspx

干杯

答案 3 :(得分:2)

调用托管代码(C#)和非托管代码(WIn32 C ++)之间的约定和内存模型差异会使它们不兼容。

但是,.NET包含COM对象的桥接技术,因此如果您将DLL映像为COM对象,则可以使其工作。但是,它显然不是COM对象。

答案 4 :(得分:1)

如果它是一个干净的C ++ DLL,你只导出C兼容的函数,那么你可以使用P / Invoke来使用这些函数。如果您将该C ++ DLL转换为带有类型库的COM DLL,则使用它更容易:您可以将类型库导入.NET,并为您创建.NET包装器(称为Runtime Callable Wrappers)。