创建C++ DLL,并从C#中调用

3
在我的项目中,我得到了一个设备,并带有C++示例代码。这些代码可以正常工作,设备也按预期工作。
但是,我需要它与我的C#接口通信,因为所有其他设备都当前使用C#接口。
因此,我计划为驱动程序创建一个DLL包装器。我将创建自己的C++库(从源代码中获得适当的接口),并使用DLLImport从C#中调用此C++库(只需在其中调用我的接口)。
我非常确定可以通过这种方式完成,但我还没有创建过C++库并从C#中使用它。因此,有人可以向我推荐一些教程,以解决我的问题吗?
我正在使用VS.NET 2008中的C++/C#。
问候, Maksud
4个回答

3

2
您可以使用C++ CLI创建一个中间库,它公开托管类但运行未管理的C++代码。您实际上可以在同一DLL中混合托管和未管理的C++代码。未管理的部分可以访问未管理的DLL而无需使用PInvoke函数。您的C#代码可以访问这个中间库中的托管类。另外,您可以利用C++ CLI这个有用的工具。

+1. 你实际上可以在同一个 DLL 中混合使用托管和非托管 C++。 - RickNZ
@RickNZ - 这就是我试图表达的,但可能没有表达清楚。现在我已经在消息中加入了你的句子,谢谢。 - Andrew Shepherd
这绝对是正确的选择,除非你有计划将你的库移植到不支持C++/CLR本地代码的Mono上。 - David Brown
游戏的名字是C++/CLI,而不是CLR。(http://en.wikipedia.org/wiki/C%2B%2B/CLI) - Doc Brown
我正在查看Jonathan Swift的博客(http://blogs.msdn.com/jonathanswift/archive/2006/10/02/780637.aspx)作为起点。现在看看CLR是否解决了我的问题。 - max
@Doc Brown - 改为CLI。(不确定为什么经常被称为CLR) - Andrew Shepherd

1

根据DLL和您需要执行的操作,您可能不需要直接创建包装器。您可以尝试使用P/Invoke来调用函数。您需要评估您的具体需求以及库/代码中已经提供的内容。


0
对于那些来到这个问题并在寻找答案的人,您可能想尝试xInterop NGen ++,一个用于本地C++ DLL的C#包装器生成器,该工具刚刚发布到公众,使用先进的P / Invoke技术可以自动和即时地为本地C++ DLL生成C#包装器。查看当前版本,免费版本即将推出。
(我是这个工具的作者)

版本2似乎仍处于早期预阿尔法阶段。用户界面很繁琐,没有生成任何文件。(“异常情况发生:无法检索PDB信息。。”) - StuWeldon
@StuWeldon,你可能尝试为C风格的DLL创建C#包装器,但当前试用版还不支持此功能。我们在最新版本中添加了对C风格DLL的支持,该版本目前还无法下载。因此,如果您仍然有兴趣使用xInterop NGen++为C风格的DLL创建包装器,请使用我们网站上的联系页面与我们联系,我们应该能够解决您遇到的问题。任何其他人有任何问题,请也请通过http://www.xinterop.com与我们联系,我们将有更好的支持能力。 - xInterop

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