我如何称呼C++/来自标准非托管非.NET应用程序的CLI(.NET)DLL?

我如何称呼C++/来自标准非托管非.NET应用程序的CLI(.NET)DLL?,.net,user-controls,c++-cli,managed,.net,User Controls,C++ Cli,Managed,在非托管世界中,我能够编写一个_declspec(dllexport),或者使用.DEF文件公开一个函数,以便能够调用DLL。(由于在C++中对.yStdCalk的名称进行了修改,所以我将别名放入.DEF文件中,这样某些应用程序可以重用某些导出的DLL函数。)现在,我感兴趣的是能够以非托管方式从.NET程序集中公开单个入口点函数,但它可以在DLL中进入.NET样式函数。以简单直接的方式,这可能吗 我有一个第三方程序,我通过DLL(插件)扩展了这个程序,它实现了一些复杂的数学运算。然而,第三方程序

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

我有一个第三方程序,我通过DLL(插件)扩展了这个程序,它实现了一些复杂的数学运算。然而,第三方程序无法让我将计算可视化。我想以某种方式获取这些预先编写的数学函数,将它们编译成一个单独的DLL(但在.NET中使用C++/CLI),然后向函数添加钩子,这样我就可以在.NET用户控件中呈现引擎罩下发生的事情。我不知道如何将.NET内容与非托管内容混合在一起,也不知道谷歌如何完成这项任务


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

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

在非托管应用程序中使用托管代码


另请参见和。

使用C++/CLI是因为您想,还是因为您认为必须导出函数

对于后者,请查看my,它允许您用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();
}

我想使用C++/CLI,因为第三方库只需使用/clr选项即可自动编译。然后,在.NET框架中添加连接将使生活变得更好(我认为)。您的示例似乎是一种合理的方法。谢谢你。我不确定我是否在跟踪你。当您获取我的项目模板时,它也会自动编译(它甚至会创建一个.lib文件)。除非我误解了您的意思,您实际上想使用C++/CLI。如果我需要在名称上使用u stdcall,并且想要去掉名称上的@number,并且需要在.DEF文件中创建别名,那么在这种情况下我该怎么做?我需要的是一个extern“C”样式的签名,以便特定类型的第三方应用程序可以调用它。只需在导出上使用extern“C”和_stdcall声明符即可。您不需要.def文件。示例发布。@HansPassant“编译器注入存根”是什么意思?编译器是否生成.LIB(并且调用unLabDead函数()的调用程序需要链接到LIB)?C++编译器自动生成大量的魔法代码。这是编译器的工作,它使看似非常困难的代码看起来很容易。多重继承与虚拟基类,这是火箭科学。那个存根,容易多了。