调整.NET Interactive Notebook运行时标识以加载.NET Framework旧程序集
问题描述
- 现有基于.NET Framework 4.8的旧程序集,非UI场景下引用了
System.Windows.Forms.dll,需要在.NET Interactive Notebook中通过Assembly.LoadFrom加载并调用该程序集。 - 执行加载操作时抛出如下异常:
Could not load file or assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified.
- 根因判断:当前.NET Interactive运行环境为.NET 6+ CoreCLR,不会检索.NET Framework版本的全局程序集缓存(GAC),仅会在待加载程序集的所在目录查找依赖文件。
- 常规可自主编译的项目,只需将目标框架名字对象(TFM)修改为
net6.0-windows即可解决该问题,但交互式笔记本无法通过重编译的方式调整运行配置。 - 尝试修改入口DLL对应NuGet缓存文件夹中的
runtimeconfig.jsontfm配置项未生效,原配置文件内容如下:
{ "runtimeOptions": { "tfm": "net6.0", "frameworks": [ { "name": "Microsoft.NETCore.App", "version": "6.0.0" }, { "name": "Microsoft.AspNetCore.App", "version": "6.0.0" } ], "configProperties": { "System.GC.Server": true, "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false } } }
- 核心疑问:修改配置不生效的原因是什么,正确的配置/解决方式是什么?
操作错误原因
修改NuGet缓存内runtimeconfig.json不生效,核心是两个认知偏差:
runtimeconfig.json仅在.NET进程启动阶段被宿主读取解析,.NET Interactive内核启动完成后,后续加载任何程序集都不会重新读取该配置,事后修改缓存文件完全不会影响已经运行的内核进程。- 配置中的
tfm字段仅作为目标框架的标记项,本身不具备触发Windows桌面运行时加载的能力,单纯修改该字段没有任何实际作用。
正确解决步骤
该问题不需要修改任何NuGet缓存或内核启动配置,直接在笔记本内执行代码配置即可解决,步骤如下:
- 在笔记本第一个代码单元执行如下代码,引入Windows桌面运行时引用,同时配置程序集版本重定向规则:
#r "nuget: Microsoft.WindowsDesktop.App.Ref, 6.0.0" using System.Runtime.Loader; AssemblyLoadContext.Default.Resolving += (context, assemblyName) => { // 将.NET Framework 4.x版本的WinForms引用重定向到.NET 6自带的WinForms程序集 if (assemblyName.Name == "System.Windows.Forms" && assemblyName.Version?.Major == 4) { return context.LoadFromAssemblyName(new AssemblyName( "System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" )); } return null; };
- 完成上述配置后,再执行原有的
Assembly.LoadFrom逻辑加载旧.NET Framework 4.8程序集即可。由于仅使用非UI场景的功能,.NET 6版本的WinForms程序集兼容层可以正常完成类型转发,不需要重新编译旧程序集。
注意:该方案仅支持Windows环境下运行的.NET Interactive,非Windows系统没有Windows桌面运行时,无法加载WinForms相关依赖。
内容的提问来源于stack exchange,提问作者Georg
相关产品推荐
相关产品推荐

