如何在linux上使用System.IO.Ports(7)?

问题描述 投票:0回答:1

我在 arch Linux PC 上运行 dotnet 7。当我将 IO 端口安装为 nuget 包时,出现 NotSupported 异常。

当我显式包含 dll 时,一切正常。
如何在本地告诉 dotnet linux 和 unix 彼此兼容?

我在这里有点迷失,因为所有必需的 dll 和 so 文件都存在于 nuget 文件夹中。

我确实找到了一种解决方法...只需将 dll 复制到基础 dll 上即可。但这不应该是这样做的方法。

c# linux nuget serial-port
1个回答
0
投票

.NET 有一个称为运行时标识符的概念,通常是诸如

win-x64
win-arm64
linux-x64
osx-arm64
等值。 .NET 运行时有一个 RID 目录,告诉它哪些 RID 与哪些其他 RID 兼容。

当您构建或发布 RID 特定输出时,.NET SDK 将确定哪些资源适用于 RID,然后将它们复制到输出目录中。否则(VS 将其显示为“AnyCPU”),.NET SDK 会将所有 RID 特定文件复制到

runtimes
子目录中,并创建一个
project.deps.json
文件,该文件由运行时在 [路径探测(https: //learn.microsoft.com/en-us/dotnet/core/dependency-loading/default-probing)。

因此,您的案件到底发生了什么取决于您未提供的信息。有太多不同的场景无法列举,但知道如何运行程序(

dotnet run
,或直接从文件夹执行二进制文件?哪个文件夹?您是否使用
-r
--rid
构建以指定特定的 RID?可能还有更多问题取决于第一个答案)

最终,这对我来说听起来像是一个 RID 问题。如果您使用 IDE 进行构建,那么首先要弄清楚等效的命令行是什么,但它可能是

dotnet build
。然后,将
-bl
添加到命令行,即
dotnet build -bl
dotnet build -r linux-x64 -bl
。这将写入一个文件
msbuild.binlog
,您可以使用 https://msbuildlog.com 打开该文件。搜索 RuntimeIdentifier,看看是否可以找出正在使用的 RID。如果它是不属于 RID 目录的 RID,则缺少“这与
unix
兼容”的映射,因此 NuGet 和 .NET SDK 都不知道复制包的
runtimes/unix 
文件。我不确定情况是否仍然如此,但在过去,默认 RID 将包含发行版名称,例如
ubuntu-x64
alpine-x64
,因为使用 musl 的发行版通常需要与使用 glibc 的发行版不同的本机二进制文件。虽然,我在 RID 目录中看到
arch
arch-x64
,但它仍然取决于 .NET SDK 和/或 .NET 运行时正确设置

© www.soinside.com 2019 - 2024. All rights reserved.