C#编写.NET程序集供MATLAB调用时System.Runtime缺失报错
问题根因
MATLAB 2022b及更早版本内置的.NET加载环境仅支持*.NET Framework 4.x*系列程序集,不兼容.NET Core 3.1、.NET 5/6/7等跨平台分支的.NET程序集。
你测试中出现不同版本System.Runtime缺失报错的逻辑非常明确:
- .NET Core 3.1、.NET 6属于和.NET Framework独立的平行运行时分支,有自己独立的一套核心基础库,你报错里提到的System.Runtime 4.2.2.0(对应.NET Core 3.1)、System.Runtime 6.0.0.0(对应.NET 6)都是这些分支自带的核心库,MATLAB默认加载的.NET Framework运行时上下文中根本不存在这些文件,自然加载失败。
- C#控制台程序能正常调用,是因为控制台项目本身和类库目标框架匹配,运行时会自动从对应版本的.NET安装目录加载核心依赖,不存在运行时不匹配的问题。
- 加载失败后dll被MATLAB锁定是已知行为:
NET.addAssembly执行时会持有目标文件的句柄,就算加载流程失败也不会主动释放,重启MATLAB即可解除锁定。
可行解决方案
- 方案1:重定向类库目标框架到.NET Framework 4.x(兼容性最好,无额外配置)
这是适配你当前MATLAB 2021b/2022a版本最稳定的方案:- 在Visual Studio 2022中右键类库项目,选择「属性」-「应用程序」-「目标框架」
- 选择
.NET Framework 4.6.2以上版本,优先推荐.NET Framework 4.8(Windows系统预装覆盖率最高,兼容性最好) - 重新编译生成dll,无需修改你现有测试代码,即可直接通过
NET.addAssembly正常加载调用。
- 方案2:升级MATLAB版本以原生支持.NET Core/.NET 6+
MATLAB从2023a版本开始正式支持.NET Core/.NET 5+程序集加载,需要额外做运行时配置:- 在系统中安装和类库目标版本一致的.NET桌面运行时(注意不能只装控制台运行时,WPF/WinForm相关桌面运行时组件是MATLAB加载.NET Core程序集的必需依赖)
- 在MATLAB中先通过
dotnetenv命令指定对应版本的.NET运行时路径,再加载程序集,示例代码:
% 将路径替换为你本机对应版本.NET桌面运行时的实际安装路径 dotnetenv("C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.25") NET.addAssembly(fullfile(pwd, "ClassLibrary1.dll")); - 方案3:通过.NET Standard 2.0做跨版本兼容
如果你需要同一份dll同时被.NET Framework项目、.NET Core/.NET 6项目、旧版MATLAB调用,可以把类库目标框架改为.NET Standard 2.0。该版本的程序集可以被.NET Framework 4.6.1+、.NET Core 3.1+、.NET 5+运行时加载,重新编译后即可在你当前的MATLAB环境下正常加载。注意.NET Standard 2.0是API规范子集,不支持.NET 6特有的新增API,如果你的代码用到了这类API会出现编译错误。
内容的提问来源于stack exchange,提问作者MiB_Coder
相关产品推荐
相关产品推荐

