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

Rud*_*lis 6 c# visual-studio-2010 razorengine

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

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

Ger*_*oli 3

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

告诉运行时通过配置加载程序集的官方方法是在该部分内的文件中添加引用web.config<compilation>

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="Newtonsoft.Json" />
  </assemblies>
</compilation>
Run Code Online (Sandbox Code Playgroud)

话虽这么说,有时 web.config 不可用,或者我想避免它因越来越多的行而变得臃肿,所以我个人更喜欢在代码中进行一行引用的黑客:(是的,一个肮脏的坏讨厌的&愚蠢的黑客,但我找不到造成太大伤害的地方)。

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

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

Assembly assembly = Assembly.LoadFrom("Newtonsoft.Json.dll");
Run Code Online (Sandbox Code Playgroud)

  • 由于我什至没有“web.config”文件,我选择了第三种方法,它工作得很好,谢谢:) (2认同)