You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调整.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缓存或内核启动配置,直接在笔记本内执行代码配置即可解决,步骤如下:

  1. 在笔记本第一个代码单元执行如下代码,引入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;
};
  1. 完成上述配置后,再执行原有的Assembly.LoadFrom逻辑加载旧.NET Framework 4.8程序集即可。由于仅使用非UI场景的功能,.NET 6版本的WinForms程序集兼容层可以正常完成类型转发,不需要重新编译旧程序集。

注意:该方案仅支持Windows环境下运行的.NET Interactive,非Windows系统没有Windows桌面运行时,无法加载WinForms相关依赖。

内容的提问来源于stack exchange,提问作者Georg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:45:41