.NET Framework4.6的VB.NET引用System.IO.Ports.Mono启动崩溃求解
问题根因
- 你替换使用的
System.IO.Ports.Mono是面向.NET Standard 2.0编译的版本,它在Windows平台下的GetPortNames方法实现,依赖独立分发的Microsoft.Win32.Registry4.1.3.0版本程序集读取注册表枚举串口列表。 - .NET Framework 4.6虽然兼容.NET Standard 2.0,但它内置的注册表相关程序集属于框架原生组件,版本、公钥标记都和该Mono库依赖的NuGet分发包不匹配,且不会自动把对应版本的独立dll输出到编译目录。
- 如果你是直接引入源码或手动添加dll引用该Mono库,没有通过包管理工具安装带依赖声明的正式包,Visual Studio不会自动还原它的依赖项,最终运行时找不到对应程序集就抛出
FileNotFoundException。
解决方法
按优先级从高到低选择以下方案:
- 安装缺失的依赖包
打开项目的NuGet包管理器,搜索安装Microsoft.Win32.Registry4.1.3版本,重新编译项目即可。也可以直接在包管理器控制台执行以下命令:
安装完成后找到项目引用列表里的Install-Package Microsoft.Win32.Registry -Version 4.1.3Microsoft.Win32.Registry,确认它的复制本地属性设置为True,保证编译后dll会出现在输出目录。 - 配置程序集绑定重定向
如果安装完依赖后仍提示版本不匹配,打开项目的app.config配置文件,在<runtime>节点下添加如下绑定规则,让运行时自动将对4.1.3.0版本的引用映射到实际部署的版本:<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" /> </dependentAssembly> </assemblyBinding> - 换回框架原生串口库(仅Windows场景推荐)
这个Mono移植版的主要作用是提供非Windows平台的串口支持,如果你的应用只在Windows系统运行,直接使用.NET Framework 4.6自带的System.IO.Ports是更稳定的选择,不会出现额外依赖缺失问题。 - 手动补全依赖
如果不想安装NuGet包,可以手动找到对应版本的Microsoft.Win32.Registry.dll,放到项目编译输出目录,同时确认项目目标平台架构(x86/x64/Any CPU)和dll的架构匹配。
内容的提问来源于stack exchange,提问作者Moshe B
相关产品推荐
相关产品推荐

