MVVMCross(.NET Standard类库)调用Serial port抛出FileNotFoundException异常
问题根因
该异常和MvvmCross框架机制无关,属于.NET Standard类库引用平台相关NuGet包的典型部署问题:.NET Standard 2.0本身没有内置串口实现,安装System.IO.Ports包后,如果只在核心类库项目添加包引用,构建时不会自动将串口相关的运行时程序集传递到作为启动项的WPF项目输出目录,CLR加载SerialPort类型时找不到对应实现程序集,就会抛出System.IO.FileNotFoundException。
排查步骤
- 开启Visual Studio的Common Language Runtime Exceptions中
System.IO.FileNotFoundException的「抛出时中断」开关,复现异常后查看异常详情里的FusionLog(程序集绑定日志),可以直接定位到缺失的具体程序集名称、版本以及CLR的搜索路径,绝大多数场景下日志会明确提示缺失System.IO.Ports.dll。 - 检查WPF启动项目的NuGet引用列表,确认是否安装了
System.IO.Ports包,核心类库添加的包引用默认不会自动流向上层启动项目,这是该问题出现的最常见原因。 - 核对核心类库和WPF项目安装的
System.IO.Ports版本号,版本不一致也会导致程序集加载匹配失败。
解决方案
- 最直接的处理方式:在WPF启动项目上安装和核心类库完全相同版本的
System.IO.PortsNuGet包,清理解决方案后重新生成即可。启动项目持有包引用时,构建流程会自动把串口相关的运行时文件拷贝到输出目录。 - 如果不希望在WPF项目直接添加串口包引用,可以修改核心类库的项目文件,调整包引用的传递属性:右键核心类库项目选择「编辑项目文件」,找到
System.IO.Ports对应的PackageReference节点,添加PrivateAssets="none"配置,让包引用可以正常传递到上层引用项目:
<PackageReference Include="System.IO.Ports" Version="对应你安装的版本号"> <PrivateAssets>none</PrivateAssets> </PackageReference>
修改保存后重新生成解决方案即可。
- 兼容性注意事项:如果你的WPF项目是基于.NET Framework而非.NET Core/.NET 5+,建议选择4.7.x版本的
System.IO.Ports包,高版本包附带的运行时依赖在.NET Framework环境下更容易出现加载失败问题。
内容的提问来源于stack exchange,提问作者bjtBatu
相关产品推荐
相关产品推荐

