在 Windows 计算机上动态加载程序集时“System.IO.Ports 目前仅在 Windows 上受支持”

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

控制台应用程序动态加载包含引用 System.IO.Ports的类的程序集。

应用程序和类库目标都是net8.0-windows

我收到异常 System.IO.Ports 目前仅在 Windows 上受支持。,即使命令 OperatingSystem.IsWindows() 返回 true

如果我从控制台应用程序添加对类库的引用,错误就会消失。

我猜想在动态加载期间,有关目标运行时的信息会丢失。

添加

<RuntimeIdentifiers>win-x64</RuntimeIdentifiers> 

对项目没有帮助。

GitHub 上提供了最小的可重现示例。

控制台应用程序项目文件:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
</PropertyGroup>

类库工程文件:

<PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="System.IO.Ports" Version="8.0.0" />
</ItemGroup>

程序.cs:

using System.Reflection;

try
{
    var serialPortPath = "..\\..\\..\\..\\SerialPort\\bin\\Debug\\net8.0-windows\\SerialPort.dll";
    var serialAssembly = Assembly.LoadFrom(serialPortPath);
    var serialPort = Activator.CreateInstance(serialAssembly.GetType("SerialPort.SerialPort"));
}
catch    
{
    // Do nothing
}

串口.cs:

namespace SerialPort
{
    public class SerialPort
    {
        public SerialPort()
        {
            var serial = new System.IO.Ports.SerialPort();
        }
    }
}

异常抛出于

var serial = new System.IO.Ports.SerialPort();
c# windows .net-core serial-port
1个回答
0
投票

因为

SerialPort.dll
依赖于
System.IO.Ports.dll
,当你加载
SerialPort.dll
时,运行时会自动从同一个文件夹加载
System.IO.Ports.dll
,但不幸的是这是一个错误的汇编文件,要加载的正确汇编文件位于
runtimes\win\lib\net8.0\ 
文件夹,需要手动加载后再加载
SerialPort.dll

Assembly.LoadFrom(@"..\..\..\..\SerialPort\bin\Debug\net8.0-windows\runtimes\win\lib\net8.0\System.IO.Ports.dll");
© www.soinside.com 2019 - 2024. All rights reserved.