在c#中使用c ++库

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

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


Microsoft Visual Studio

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

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

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

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

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

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

-要么-

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

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

如果是非托管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

干杯

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

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

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