是否可以在 Linux 上使用 .Net Core 3.1 创建 C++/CLI 代码的 C# DLL

Is it possible to create a C# DLL of C++/CLI code using .Net Core 3.1 on Linux

这可能是一个非常具体的问题。但其他一些人也可能会感兴趣。

设置可能很常见:我们使用 C++ 和 Linux 开发了一个嵌入式设备,并为此建立了一个构建系统。在我们的设备中,我们使用基于 DLL 的插件机制发布了一个 C# 桌面应用程序。该插件包含在嵌入式设备和应用程序上使用的共享逻辑。为了简化流程,最好在我们的 Linux 构建系统上创建 DLL(因此我想使用 .Net Core 而不是 "normal" .Net)。

据我的试验和错误表明这是不可能的 - 即使使用 .Net Core 3.1。你能证实吗?该软件仅适用于 windows(尽管它是在 Linux 上编译的)——所以理论上它是可能的,因为 .Net Core 在版本 3.1 (https://devblogs.microsoft.com/dotnet/announcing-net-core-3-1/) 中支持 CLI/C++。

我尝试了什么:

  1. 我在 Linux 上使用控制台应用程序 dotnet
  2. 成功地将 Linux 上的纯 C# 代码编译为 exe 运行
  3. 我按照本指南使用示例代码在 Windows 上成功创建了一个简单的 C++/CLI 测试应用程序:https://devblogs.microsoft.com/cppblog/an-update-on-cpp-cli-and-dotnet-core/
  4. 最后,我采用了(可能过于天真)方法将测试应用程序的 .vcxproj 替换为步骤 1 中的 .csproj(.csproj 似乎会自动检测文件)。我收到以下错误消息:

quote CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [/home/vagrant/Projects/cpp_dotnet_on_linux/cs_on_linux.csproj]

有什么我可以改进的吗?或者这个任务是不可能完成的(手动将 cpp 文件添加到 .csproj,...)?恐怕这在技术上是不可能的,因为我猜 .Net Core 在 Linux 上缺少 C++ 编译器,但我不确定。

C++/CLI 在 Linux 上不受支持。

一些来源:

https://devblogs.microsoft.com/cppblog/the-future-of-cpp-cli-and-dotnet-core-3/ :

We don’t currently have plans for C++/CLI for targeting macOS or Linux. Additionally, compiling with “/clr:pure” and “/clr:safe” won’t be supported for .NET Core.

https://github.com/dotnet/coreclr/issues/659#issuecomment-539742740

C++/CLI on Linux will not be supported and would be very challenging. It would require Microsoft VC++ to support Linux or require Clang or GCC to support C++/CLI. Those are both huge projects with uncertain payoff. It is also unclear if Clang or GCC would ever allow us to upstream our changes. Maintaining an up-to-date fork of a fast moving compiler project forever is very expensive. We have no plans to take on either of those projects.