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

Posted

技术标签:

【中文标题】是否可以在 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 【发布时间】:2020-01-28 17:05:06 【问题描述】:

这可能是一个非常具体的问题。但是对于其他一些人来说,这可能也很有趣。

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

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

我尝试了什么:

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

引用 CSC:错误 CS5001:程序不包含适用于入口点的静态“主要”方法 [/home/vagrant/Projects/cpp_dotnet_on_linux/cs_on_linux.csproj]

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

【问题讨论】:

纠正我的错误,我不完全理解您的设置:您提供了一个运行 Linux 的设备和一个 适用于 Windows 的应用程序允许用户与设备交互。此应用程序使用了一个 DLL,其中包含逻辑和设备通信。您希望此 DLL 和应用程序能够通过依赖 .NET Core 在 Windows 和 Linux 之间移植。与嵌入式设备通信的代码是用本机 C++ 编写的,专为 Linux 构建,但您想用 C++/CLI 包装它,以便在 .NET Core 中使用。这一切都正确吗? 在大多数情况下你是对的。但是带有 C# 接口的 DLL 仅适用于 Windows,但我想在 Linux 上构建它。但是将嵌入 DLL 中的 C++ 代码将在 Windows 和 Linux 上使用。 在这种情况下,您应该使用 P/Invoke 而不是 C++/CLI 来与您的本机 C++ 代码交互。这确实意味着您必须为每个平台(.so / .dll)构建一个版本的 C++ 库,然后可以从单个 .NET Core“DLL”中 P/Invoke 任一库。 (.NET Core 仍然可以在 Linux 上构建仅用于 dotnet 的“DLL”,但它们不是真正的 Windows DLL) 这是个好主意。我已经知道 P/Invoke - 这是我们的计划 b。但是使用 .Net Core 作为可以在 Linux for Windows 上交叉编译的包装器是一个好方法。由于 g++ 也允许交叉编译,我们可以在 Linux 上做任何事情。 【参考方案1】:

Linux 不支持 C++/CLI。

一些来源:

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

我们目前没有针对 macOS 或 Linux 的 C++/CLI 计划。此外,.NET Core 不支持使用“/clr:pure”和“/clr:safe”进行编译。

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

Linux 上的 C++/CLI 将不受支持,并且非常具有挑战性。它需要 Microsoft VC++ 来支持 Linux,或者需要 Clang 或 GCC 来支持 C++/CLI。这些都是回报不确定的巨大项目。尚不清楚 Clang 或 GCC 是否会允许我们将更改上传到上游。永远维护一个快速移动的编译器项目的最新分支是非常昂贵的。我们没有计划承接其中任何一个项目。

【讨论】:

以上是关于是否可以在 Linux 上使用 .Net Core 3.1 创建 C++/CLI 代码的 C# DLL的主要内容,如果未能解决你的问题,请参考以下文章

.net 标准是不是像 .net Core 一样跨平台? [复制]

是否可以使用 .Net Core 2.2 在 AWS Lambda 上使用 Kinesis FireHose 执行 PutRecord?

在VS2019 / .Net Core 3.1中使用“生产单个文件”发布选项时,是否可以保持appsettings.json可编辑的后期部署?

(17)ASP.NET Core EF基于数据模型创建数据库

So Easy - 在Linux服务器上部署 .NET Core App

如何将.Net Core应用程序部署在Linux操作系统上运行