【问题标题】:Will mixed mode assemblies (C++/CLI projects) work on .NET Core?混合模式程序集(C++/CLI 项目)能否在 .NET Core 上运行?
【发布时间】:2015-06-15 04:59:42
【问题描述】:

我有一个使用 C++/CLI 项目的代码库,该项目通过瘦包装类将 C++ 类公开给 CLR。比如……

C++ 项目中的 C++ 代码

class Foo {
    public Foo(bool wat) { /* do the things */ }
};

混合模式程序集中的 C++/CLI 代码(C++/CLI 项目)

public ref class ManagedFoo {
    Foo * foo;
public:
    ManagedFoo (bool wat) { foo = new Foo(wat); }
    !ManagedFoo () { delete foo; }
    ~ManagedFoo () { this->!ManagedFoo (); }
};

据我所知,混合模式程序集几乎只能在 Windows .NET 上运行。我希望我不需要重构组件并使用P/Invoke,这将为我提供跨平台支持。

有谁知道 .NET Core 是否支持混合模式程序集?欢迎其他想法。

【问题讨论】:

  • 不,CoreCLR 不支持模块初始化器。这也没有任何意义,C++/CLI 编译器仅适用于 Windows,它不是开源的。

标签: c++ .net c++-cli .net-core mixed-mode


【解决方案1】:

C++/CLI 上下文中的非托管代码始终是特定于平台的,并且针对特定的操作系统 (Windows) 和特定的 CPU 架构 (x86/x64) 进行编译。 C++/CLI 中的非托管代码最终很像使用 C++ 编译器编译的实际 C++ 代码。由于混合模式程序集可以包含本机代码,因此它们绑定到特定的操作系统和 CPU 架构。

编辑(2019 年 3 月):此答案早于 .Net Core,在 Core 上下文中可能已过时。

【讨论】:

  • 在实践中,我确信这大部分是正确的(尤其是当您的本机代码使用 C(++) 运行时或标准库时),但是交叉编译呢?这也是 MSVC++ 做不到的吗?
  • 但这并不意味着混合程序集不能在特定平台上初始化CoreCLR,对吧?
  • @weipengL 看我的回答。
  • @WeipengL 我的回答在这种情况下可能已经过时,编辑它以澄清。
【解决方案2】:

混合模式程序集是否适用于 .NET Core 不是由特定于平台的代码决定的。正在处理对混合模式程序集的支持:

https://github.com/dotnet/coreclr/issues/18013

据我了解,这需要重新编译 C++/CLI 项目以针对 .NET Core。

当然,在 Windows 上使用 x86 代码的混合模式程序集只能在 Windows 等中作为 x86 工作。

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2013-06-27
    相关资源
    最近更新 更多