由于第三方软件依赖性,我无法详细介绍,我们需要能够在没有/ clr标志的情况下在C ++项目中创建用C#编写的DotNet标准类对象,并在该对象上调用方法。可以这样做吗?
需要说明的是,DotNet标准是一个单独的程序集,它具有从没有/ clr标志编译的VC ++ DLL调用的对象和方法。基本上,我们需要在没有完整DotNet Framework Runtimes的机器上部署程序集,但是将安装DotNet Core / Standard SDK(或将部署为self-contained deployment)。
除非您知道互操作方法在上述方案中实际有效,否则请不要回答“试试这个”。
有很多方法可以与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_initialize
,coreclr_execute_assembly
和coreclr_create_delegate
。后者被描述为“创建一个指向托管方法的函数指针”。
看起来这个API不支持调用构造函数,因为设计人员认为将工厂函数编写为静态方法很简单,coreclr_create_delegate
确实支持。