控制台应用程序动态加载包含引用 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();
因为
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");