【问题标题】:Create .Net Standard object from C++从 C++ 创建 .Net 标准对象
【发布时间】:2019-02-28 03:59:34
【问题描述】:

由于第三方软件依赖关系,我无法详细说明,我们需要能够从编译的 C++ 项目中创建一个用 C# 编写的 DotNet 标准类对象 /clr 标志并调用该对象上的方法。这个可以吗?

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

请不要回复“试试这个”,除非您知道互操作方法实际上适用于上述场景。

【问题讨论】:

    标签: c# c++ .net .net-standard


    【解决方案1】:

    有多种方法可以通过 C++ 与 .NET 进行互操作,其中一些不需要/clr。但是,它们都不能帮助避免

    我们需要在没有完整 DotNet 框架运行时的机器上部署程序集

    如果您有一个包含 MSIL 的程序集,则需要安装 .NET Framework(至少是客户端配置文件)。这是因为这些程序集不包含可执行代码,仅包含可移植描述,用作 .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 确实支持。

    【讨论】:

    • @ben-voight,有趣的是,您说需要完整框架。据我了解,当 .Net 标准程序集部署为依赖于框架或自包含时,系统范围的 .Net Core SDK 应满足 JIT 要求。我试图更好地理解这一点,而不是质疑你所说的。
    • @batta:需要哪个配置文件取决于您和您的依赖项使用的类。 SDK 无济于事,您需要运行时。如果要使用 .NET Core 运行时,则必须在构建期间以 .NET Core 为目标。 .NET Standard 程序集依赖于与来自 Core 的版本不同且不兼容的 mscorlib 和 System.dll 版本。
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多