gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:49:31 27 4
gpt4 key购买 nike

在非托管世界中,我能够编写一个 __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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com