如何强制 C# 运行时加载仅在作为 Razor 模板的 .cshtml
文件中使用的程序集?
我正在使用 Newtonsoft
的 JSON 序列化功能,程序集被项目引用,但是当 Razor 引擎编译模板时,我收到一个错误,提示 Newtonsoft
命名空间未知。我还看到 dll 实际上没有加载(我想这是有道理的,因为它没有在 C# 代码中的任何地方被引用)。如果我在我的 C# 代码中的某处添加了一条虚拟行,它引用了程序集中的任何函数,它就会被加载并且 Razor 很高兴。有没有办法指定应该加载程序集,即使它没有被引用?我真的不想在代码中留下虚拟行。
最佳答案
你是对的,编译器在编译/优化期间删除了项目引用,因为它检测到它并没有真正被代码使用。
通过配置告诉运行时加载程序集的官方方法是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 不可用,或者我想避免用越来越多的行使其膨胀,所以我个人更喜欢在代码中引用一行的 hack:(是的,一个肮脏的糟糕而愚蠢的黑客攻击,但我发现没有造成太大伤害)。
class LoadNewtonSoftHack
{
private void DoNothing()
{
var o = Newtonsoft.Json.Linq.JValue.Parse("{}");
}
}
第三种选择是在 Web 应用程序启动时强制加载程序集:(但确保您的构建复制了 bin\
文件夹中的 .dll)。
Assembly assembly = Assembly.LoadFrom("Newtonsoft.Json.dll");
关于c# - 强制 C# 加载仅在 cshtml 文件中引用的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39334206/