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

访问C#静态类静态属性时触发NullReferenceException的排查求助

静态类空引用异常及.NET程序集加载问题排查

问题场景

引入厂商库时新增了类库项目管理依赖,此前通过降级NuGet包解决了厂商库依赖的System.*组件与当前.NET版本不兼容的问题。但访问厂商提供的带静态属性的静态类DataDisplayInfos时,出现了针对该类的NullReferenceException——按常识静态类无需实例化,本不应触发空引用异常。

解决方案结构如下:

  • 解决方案
    • 应用程序项目
    • 应用模块类库
      • 厂商库DLL文件

访问代码片段:

public static class DataDisplayInfos {
    public static IEnumerable<MeasurementInfo> MeasurementInfoList { get; }
}

补充异常详情

后续捕获到完整异常栈,发现NullReferenceException是表象,真实触发的是TypeInitializationException:

Unhandled Exception: System.TypeInitializationException: 
The type initializer for 'Ion.Sdk.Ddr.DataDisplayInfos' threw an exception. ---> System.NotSupportedException: 
An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. 
This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. 
   at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)
   at System.Reflection.Assembly.LoadFile(String path)
   at Ion.Sdk.Ddr.DataDisplayInfos.CreateInstanceBinaryStore(String assemblyLocation)
   at Ion.Sdk.Ddr.DataDisplayInfos..cctor()
   --- End of inner exception stack trace ---
   at Ion.Sdk.Ddr.DataDisplayInfos.get_MeasurementInfoList()
   at MetrelBlackBoxDevice.MI3325.FindMeasurement()
   at mvp_nullexcept.Program.Main(String[] args)

同时发现将项目改为控制台应用可解决错误,但无法集成到父项目,疑问:项目编译为类库或控制台应用会影响依赖加载吗?

排查与解决方向

  1. 明确异常本质:
    你看到的NullReferenceException是因为静态类的静态构造函数(.cctor())执行失败,导致类初始化未完成,访问静态属性时触发的间接异常。核心问题是厂商静态构造函数中调用Assembly.LoadFile()加载程序集时,遇到了网络位置程序集的权限限制。

  2. 解决程序集加载权限问题:

    • 检查厂商库依赖的所有DLL是否来自网络路径:右键DLL→属性,若有“解除锁定”选项则勾选,解除系统的安全标记。
    • 在主应用的配置文件(app.config/web.config,类库无独立配置,需依赖引用它的主应用配置)中添加loadFromRemoteSources开关:
      <configuration>
          <runtime>
              <loadFromRemoteSources enabled="true"/>
          </runtime>
      </configuration>
      
  3. 对比厂商示例项目的差异:

    • 检查示例项目的配置文件是否已经包含上述开关。
    • 确认示例项目中所有依赖DLL的存放路径是本地目录,而非网络共享文件夹。
    • 核对示例项目的.NET版本、NuGet包版本与你的项目是否完全一致,之前的NuGet降级可能引入了隐性兼容问题。
  4. 类库与控制台应用的差异解析:

    • 控制台应用有独立的配置文件,若示例控制台能正常运行,大概率是它的config中已经配置了loadFromRemoteSources;而你的类库依赖的主应用配置缺失该设置,导致加载失败。
    • 两者的权限上下文差异极小,核心问题还是配置文件的生效范围——类库的配置继承自主应用,而非自身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:07:10