从C ++创建.Net标准对象

问题描述 投票:2回答:1

由于第三方软件依赖性,我无法详细介绍,我们需要能够在没有/ clr标志的情况下在C ++项目中创建用C#编写的DotNet标准类对象,并在该对象上调用方法。可以这样做吗?

需要说明的是,DotNet标准是一个单独的程序集,它具有从没有/ clr标志编译的VC ++ DLL调用的对象和方法。基本上,我们需要在没有完整DotNet Framework Runtimes的机器上部署程序集,但是将安装DotNet Core / Standard SDK(或将部署为self-contained deployment)。

除非您知道互操作方法在上述方案中实际有效,否则请不要回答“试试这个”。

c# c++ .net .net-standard
1个回答
2
投票

有很多方法可以与C ++交互使用.NET,其中一些不需要/clr。但是,它们都不会有助于避免

我们需要在没有完整DotNet Framework Runtimes的机器上部署程序集

如果您有包含MSIL的程序集,则需要安装.NET Framework(至少是Client Profile)。那是因为这些程序集不包含可执行代码,只有一个可移植的描述,作为.NET运行时的即时(JIT)编译器的输入。


有几个工具链可以从C#编译为本机代码,具有不同级别的所需运行时支持,但在使用任意.NET Framework库时,这些工具链都不会被视为“生产质量”。 (.NET Native适用于针对WinRT的库)。这些工具可以处理的代码存在很大的限制(例如,反射受到严格限制,只有内省,没有运行时代码生成甚至类型组合)。这些限制不仅适用于您的代码,还适用于所有依赖项。


如果要部署程序集所需的.NET版本(注意:问题已编辑为.NET Core,而不仅仅是“没有.NET”),那么您可以使用“本教程”中的Hosting API将涵盖构建一个C ++应用程序来托管.NET Core“

在此过程中,您将动态链接(GetProcAddress)函数,如coreclr_initializecoreclr_execute_assemblycoreclr_create_delegate。后者被描述为“创建一个指向托管方法的函数指针”。

看起来这个API不支持调用构造函数,因为设计人员认为将工厂函数编写为静态方法很简单,coreclr_create_delegate确实支持。

© www.soinside.com 2019 - 2024. All rights reserved.