.NET Core 3.1项目引用VB编写的DLL运行加载类型报错如何解决
报错原因
你调用的VB DLL是基于.NET Framework编译的,依赖.NET Framework原生Microsoft.VisualBasic程序集中的Microsoft.VisualBasic.Devices.Computer类型,.NET Core 3.1自带的Microsoft.VisualBasic兼容包没有完整实现该类型,且.NET Core不支持Microsoft.CodeDom.Providers.DotNetCompilerPlatform这类Framework专属的编译器包,才会出现加载失败的问题。
解决方案
方案1:安装官方兼容包并配置绑定重定向(优先尝试)
- 首先通过NuGet安装
Microsoft.VisualBasic官方兼容包,选择匹配.NET Core 3.1的10.0.3及以上版本即可 - 打开项目根目录下的*.runtimeconfig.json文件,添加如下配置,允许加载.NET Framework编译的程序集:
{ "runtimeOptions": { "configProperties": { "System.Runtime.Loader.AllowDefaultAssemblies": true }, "additionalProbingPaths": [ "你存放VB DLL的本地绝对路径" ] } }
- 若仍报程序集版本不匹配,在项目.csproj文件中开启自动绑定重定向:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.VisualBasic" Version="10.0.3" /> </ItemGroup> </Project>
方案2:COM互操作调用(方案1无效时使用)
无需修改原VB DLL,将其注册为COM组件后通过COM互操作调用,绕开.NET运行时的程序集加载校验:
- 在部署服务的设备上用管理员权限执行命令:
regsvr32 你的VB DLL的完整路径 - 回到.NET Core项目添加对应COM组件的引用,直接调用目标函数即可,无需依赖.NET Framework版Microsoft.VisualBasic程序集。
方案3:.NET Framework代理服务兜底
如果前两个方案都不生效(比如原VB DLL依赖了更多.NET Framework专属Win32 API),可以单独搭建一个轻量的.NET Framework Web API作为代理服务,专门负责调用该VB DLL,你的.NET Core 3.1服务通过内网HTTP请求调用代理服务获取结果,完全规避跨运行时的程序集兼容问题。
内容的提问来源于stack exchange,提问作者bitapn
相关产品推荐
相关产品推荐

