如何从标准的非托管非.NET应用程序调用C ++ / CLI(.NET)DLL?

时间:2010-05-17 20:18:11

标签: .net user-controls c++-cli managed

在非托管世界中,我能够编写__declspec(dllexport),或者使用.DEF文件来公开一个能够调用DLL的函数。 (由于在C ++中使用__stdcall进行名称修改,我将别名放入.DEF文件中,以便某些应用程序可以重用某些导出的DLL函数。)现在,我感兴趣的是能够从一个单独的入口点函数公开.NET程序集,以非托管方式,但让它在DLL中进入.NET样式的函数。这可能是一种简单而直接的方式吗?

我所拥有的是通过实现一些复杂数学的DLL(插件)扩展的第三方程序。但是,第三方程序无法让我可视化计算。我想以某种方式采用这些预先编写的数学函数,将它们编译成一个单独的DLL(但在.NET中使用C ++ / CLI),然后在函数中添加钩子,这样我就可以在.NET中渲染一些内容。用户控制。我不确定如何将.NET内容与非托管内容混合在一起,或者谷歌将如何完成此任务。

关于托管/非托管网桥的具体建议,或以我所描述的方式完成渲染的替代方法将会有所帮助。谢谢。

3 个答案:

答案 0 :(得分:4)

您是否使用C ++ / CLI,或者因为您认为必须导出函数?

如果是后者,请查看我的unmanaged exports,它允许您在C#中声明非托管导出,相当于DllImport的工作方式。

internal class Sample
{
  [DllExport("_export_test", CallingConvention.Cdecl)]
  static int Test(int a)
  {
     return a + 1;
  }
}

答案 1 :(得分:4)

好吧,C ++ / CLI编译器使它非常简单。只需编写一个静态托管函数,并使用__declspec(dllexport)对其进行归属。编译器注入一个存根,该存根自动加载CLR以执行托管代码。

这是一种可维护的方法,它不是非常可扩展的,而且速度也不会很快。下一步是您使用[ComVisible(true)]属性编写ref类。使用Regasm.exe注册后,任何非托管的COM感知客户端都可以使用该服务器。自己托管CLR(CorBindToRuntimeEx)通常是最后的选择,但是最普遍的选择。


示例代码:

ref class ManagedClass {
public:
  static void StaticFunc() {}
};

extern "C" __declspec(dllexport)
void __stdcall UnmanagedFunc() {
  ManagedClass::StaticFunc();
}

答案 2 :(得分:3)

此CodeProject文章很好地解释了这个过程。

在非托管应用程序中使用托管代码
http://www.codeproject.com/KB/mcpp/ijw_unmanaged.aspx

另请参阅herehere