强制 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");
如何强制 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");