嘿伙计们,我正在尝试在我的c#项目中包含c ++库(DLL),但每次我这样做,我都会在VS2008中收到以下错误信息,有什么建议吗?
编辑:这是一个C ++ MFC DLL
无法添加对“C:\ Users \ cholachaguddapv \ Desktop \ imaging.dll”的引用。请确保该文件是可访问的,并且它是有效的程序集或COM组件。
答案 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)。