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

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

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

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

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

最佳答案

好吧,C++/CLI 编译器让它变得非常简单。只需编写一个静态托管函数并使用 __declspec(dllexport) 对其进行归因。编译器会注入(inject)一个 stub ,该 stub 会自动加载 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();
}

关于.net - 如何从标准的非托管非 .NET 应用程序调用 C++/CLI (.NET) DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2852428/

相关文章:

c# - TPL 任务的 ThreadStatic

c# - float 比较函数说明

c# - Entity Framework 和指南

javascript - 多个用户控件实例的相同 JavaScript 不起作用

vb.net - 在 Vb.Net 窗体中处理跨线程异常

c++-cli - 将整数值转换为 ASCII 字符

c++ - 旧报告 ("Embedded"Access 2003 的升级路径)?

c# - 如何在 C++/CLI 中包装 C++ 接口(interface)(抽象类)?

c# - 如何接受函数引用作为参数?

asp.net - 自定义 UserControl 未在 ASP.NET 中注册