强制 C# 加载仅在 cshtml 文件中引用的程序集

Force C# to load an assembly that is referenced only in a cshtml file

如何强制 C# 运行-time 加载仅在作为 Razor 模板的 .cshtml 文件中使用的程序集?

我正在使用 Newtonsoft 中的 JSON 序列化功能,该程序集被项目引用,但是当 Razor 引擎编译模板时,我得到一个错误 Newtonsoft命名空间未知。我还看到 dll 实际上没有加载(我想这是有道理的,因为它没有在 C# 代码中的任何地方被引用)。如果我在我的 C# 代码中的某处添加了一条虚拟行,它引用了程序集中的任何函数,它就会被加载并且 Razor 很高兴。有没有办法指定应该加载程序集,即使它没有被引用?我真的不想在代码中留下虚拟行。

你是对的,编译器在 compilation/optimization 期间删除了项目引用,因为它检测到它并没有真正被代码使用。

官方通过配置告诉运行时加载程序集的方法是add a reference in your web.config file inside the <compilation> section

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="Newtonsoft.Json" />
  </assemblies>
</compilation>

话虽这么说,但有时 web.config 不可用,或者我想避免用越来越多的行使其膨胀,所以我个人更喜欢在代码中引用一行的技巧:(是的,一个肮脏的、糟糕的、愚蠢的黑客,但我发现没有造成太大的伤害。

class LoadNewtonSoftHack
{
    private void DoNothing()
    {
        var o = Newtonsoft.Json.Linq.JValue.Parse("{}");
    }
}

第三种选择是在 Web 应用程序启动时强制加载程序集:(但确保您的构建复制 bin\ 文件夹中的 .dll)。

Assembly assembly = Assembly.LoadFrom("Newtonsoft.Json.dll");