繁体   English   中英

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

[英]How do I call C++/CLI (.NET) DLLs from standard, unmanaged non-.NET applications?

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

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

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

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

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

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

好吧,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();
}

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

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

另见这里这里

暂无
暂无

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

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