在C#中使用C++库

23

我正在尝试在我的C#项目中包含一个C++库(DLL),但每次这样做时,我都会在VS2008中收到以下错误信息,请问有什么建议吗?

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

---------------------------
Microsoft Visual Studio
---------------------------
A reference to 'C:\Users\cholachaguddapv\Desktop\imaging.dll' could not be added. Please make sure that the file is accessible, and
that it is a valid assembly or COM component.
5个回答

28

如果它是一个“普通”的 DLL(不是 COM,也不是托管的 C++),你不能像这样添加引用。你必须为你想要调用的 DLL 导出函数添加 p/invoke 签名(外部静态方法定义)。

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

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


10

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

你有两个选择,可以将C++库编译为程序集,并使用C++/CLI包装器公开未管理的代码。

-或-

如果该库通过C API公开其功能,则可以使用一些p/invoke调用。

你能否扩展问题并包含一些关于如何从C++通常调用imaging.dll的细节?


7

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

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

然而,.NET包括一种用于COM对象的桥接技术,因此,如果您将DLL想象成一个COM对象,它就可以正常工作。但是,显然它并不是一个COM对象。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接