由于与第三方软件有关,所以我无法详细介绍,我们需要能够在没有/ clr标志的 编译的C ++项目中创建用C#编写的DotNet标准类对象。并在该对象上调用方法。能做到吗?
要清楚,DotNet标准是一个单独的程序集,其中包含要从不带/ clr标志的VC ++ DLL调用的对象和方法。基本上,我们需要在没有完整的DotNet Framework运行时的计算机上部署程序集,但是将安装DotNet Core / Standard SDK(或将其部署为self-contained deployment)。
除非您知道互操作性方法在上述情况下确实有效,否则请不要以“尝试此操作”作为响应。
答案 0 :(得分:2)
有多种方法可以从C ++与.NET互操作,其中有些不需要/clr
。但是,它们都无法避免
我们需要在没有完整的DotNet Framework运行时的计算机上部署程序集
如果您有一个包含MSIL的程序集,则需要安装.NET Framework(至少是客户端配置文件)。这是因为这些程序集不包含可执行代码,而只是一个可移植的描述,用作.NET运行时的即时(JIT)编译器的输入。
有几种工具链可以从C#编译为本机代码,具有不同级别的所需运行时支持,但是在使用任意.NET Framework库时,不会被视为“生产质量”。 (.NET Native将适用于针对WinRT的库)。这些工具可以处理的代码受到很大限制(例如,反射受到严格限制,只能进行自省,不能生成运行时代码,甚至不能组成类型)。这些限制不仅适用于您的代码,还适用于您的所有依赖项。
如果您要部署程序集所需的.NET版本(请注意:问题已编辑为.NET Core,而不仅仅是“没有.NET”),则可以使用Hosting API,其中显示“本教程将涵盖构建C ++应用程序以承载.NET Core”
在此过程中,您将动态链接(GetProcAddress
)函数,例如coreclr_initialize
,coreclr_execute_assembly
和coreclr_create_delegate
。后者的描述为“创建指向托管方法的函数指针。”
该API似乎不支持调用构造函数,因为设计者认为将工厂函数作为静态方法编写很简单,coreclr_create_delegate
支持。