use*_*400 8 .net user-controls c++-cli managed
在非托管的世界中,我能够编写__declspec(dllexport),或者使用.DEF文件来公开一个能够调用DLL的函数.(由于在C++中使用__stdcall进行名称修改,我将别名放入.DEF文件中,以便某些应用程序可以重用某些导出的DLL函数.)现在,我感兴趣的是能够从一个单独的入口点函数公开.NET程序集,以非托管方式,但让它在DLL中进入.NET样式的函数.这可能是一种简单而直接的方式吗?
我所拥有的是第三方程序,我通过DLL(插件)扩展,实现了一些复杂的数学.但是,第三方程序无法让我可视化计算.我想以某种方式采用这些预先编写的数学函数,将它们编译成一个单独的DLL(但在.NET中使用C++/CLI),然后在函数中添加钩子,这样我就可以在.NET中渲染一些内容.用户控制.我不确定如何将.NET内容与非托管内容混合,或者谷歌如何完成此任务.
关于托管/非托管网桥的具体建议,或以我所描述的方式完成渲染的替代方法将会有所帮助.谢谢.
好吧,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();
}
Run Code Online (Sandbox Code Playgroud)
您使用 C++/CLI 是因为您想要,还是因为您认为必须导出函数?
如果是后者,请查看我的非托管导出,它允许您在 C# 中声明非托管导出,等效于 DllImport 的工作方式。
internal class Sample
{
[DllExport("_export_test", CallingConvention.Cdecl)]
static int Test(int a)
{
return a + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
这篇 CodeProject 文章很好地解释了这个过程。
在非托管应用程序中使用托管代码
http://www.codeproject.com/KB/mcpp/ijw_unmanagement.aspx