一个明智的方法是使用托管的 C++ 来访问非托管的 C++ 并编译为一个程序集。
不对,你必须使用DllImport
或所谓的PInvoke(平台调用)来从托管代码中调用本地C函数。引用仅适用于.NET程序集或具有自动生成的互操作dll的COM。
使用C++从C#变得非常困难,因为名称混淆等原因。
如果可以的话,你可以编译一个托管的C++ Dll作为包装器,使两个世界相遇。这也有一个优点,你可以将你的程序集标记为ComVisible
,从而使它可用于大量处理COM的工具。
对于C#来说,DLL内部的操作是无关紧要的。请记住,C++模板在实例化之前不会生成任何代码。如果该模板仅在DLL头文件中定义,则DLL中不会有该模板的生成代码。另一方面,如果DLL显式实例化并导出某些模板类型,则理论上可以从C#调用它们。
您需要解决两个问题。第一个问题是C++编译器混淆其方法名称,因此您必须确定正确的PInvoke名称。第二个问题是没有办法直接在C#中创建CRT对象。您必须定义一些工厂方法并将其导出。
坦白地说,我认为这一切都比它值得的麻烦多了。最好为DLL创建一个C样式API,并从C#调用这些函数。在内部,函数可以创建和操作相关的C++对象。
__gc
变成了ref
。 - jdehaan