繁体   English   中英

在 C# 中使用 C++ 库

[英]Using c++ library in c#

我正在尝试在我的 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.

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

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

查看联机帮助中的DllImport属性。

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

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

-或者-

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

您能否稍微扩展一下问题,以包括一些有关您通常如何从 C++ 调用 imageing.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 包装器(称为运行时可调用包装器)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM