创建 C++ Dll,并从 C# 调用它

Posted

技术标签:

【中文标题】创建 C++ Dll,并从 C# 调用它【英文标题】:Creating C++ Dll, and call it from C# 【发布时间】:2009-12-23 05:43:58 【问题描述】:

在我的项目中,我得到了一个带有 C++ 示例代码的设备。代码没问题,设备按预期工作。

但我需要它来与我的 C# 接口通信,因为所有其他设备当前都在使用 C# 接口。

所以我打算为驱动程序创建一个 DLL Wrapper。我将创建自己的 C++ 库(从具有适当接口的源代码)并使用 DLLImport 从 C# 调用此 C++ 库(只需在那里调用我的接口。)。

我很确定可以通过这种方式完成,但我从未创建过 C++ 库并从 C# 中使用过它。那么,任何人都可以向我推荐一些与我的问题相关的教程吗?

我正在使用 C++/C# int VS.NET 2008。

问候, 马克苏德

【问题讨论】:

【参考方案1】:

看看using a class defined in a c++ dll in c# code

【讨论】:

【参考方案2】:

您可以使用的另一个有用工具是C++ CLI。

您可以使用 C++ CLI 创建一个中间库 - 一个公开托管类但运行非托管 C++ 代码的库。您实际上可以在同一个 DLL 中混合托管和非托管 C++。

非托管部分无需使用 PInvoke 函数即可访问非托管 DLL。

您的 C# 代码可以访问此中间库中的托管类。

【讨论】:

+1。您实际上可以在同一个 DLL 中混合托管和非托管 C++。 @RickNZ - 这就是我试图传达的内容,但肯定不够清楚。我现在已将您的句子合并到消息中,谢谢。 除非你打算将你的库移植到 Mono,它不支持 C++/CLR 中的本机代码,否则这绝对是正确的选择。 游戏名称是C++/CLI,不是CLR。 (en.wikipedia.org/wiki/C%2B%2B/CLI) 我以 Jonathan Swift 的博客 (blogs.msdn.com/jonathanswift/archive/2006/10/02/780637.aspx) 为起点。现在看看 CLR 是否解决了我的问题。【参考方案3】:

根据 DLL 和您需要执行的操作,您可能不需要直接创建包装器。您也许可以使用 P/Invoke 来获得这些功能。您将需要评估您的特定需求以及提供的库/代码中已有的内容。

【讨论】:

【参考方案4】:

对于遇到这个问题并正在寻找答案的任何人,您可能想尝试一下刚刚向公众发布的xInterop NGen++ , a C# wrapper generator for native C++ DLL,该工具可以使用高级自动立即生成原生C++ DLL的C#包装器P/Invoke 技术。查看当前版本,免费版本即将推出。

(我是工具的作者)

【讨论】:

第 2 版似乎仍处于早期的 pre-alpha 阶段。界面繁琐,不生成文件。 (“发生异常:无法检索 PDB 信息..”) @StuWeldon,您可能尝试为当前试用版尚不支持的 C 样式 DLL 构建 C# 包装器,我们已在无法下载的最新版本中添加了 C 样式 DLL 支持然而。因此,如果您仍然对使用 xInterop NGen++ 为您的 C 样式 DLL 创建包装器感兴趣,请使用我们网站上的联系我们页面与我们联系,我们应该能够解决您遇到的问题。其他人有任何问题,也请通过xinterop.com与我们联系,我们将更好地为您提供支持。

以上是关于创建 C++ Dll,并从 C# 调用它的主要内容,如果未能解决你的问题,请参考以下文章

如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]

从 C# 调用 C++ 代码而不创建 dll?

使用非托管 C++ .dll 从 C# .exe 调用函数

C++ dll 和 C# 调用

在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

c++调用opencv相关函数并打包成dll,c#不能调用