我在MEF中动态加载的程序集中有一个MVC3区域
如果我使用具有强类型视图的Webforms视图引擎,一切正常
如果我使用带有dynamic
模型的Razor视图引擎,它也可以正常工作。
但如果我使用强类型Razor视图,则视图编译会在运行时失败。
问题是动态加载的程序集不在传递给C#编译器的引用程序集列表中。
生成的C#代码如下所示:
namespace ASP {
using System;
/* Other namespaces */
public class _Page_MyApp_Views_Home_Index_cshtml
: System.Web.Mvc.WebViewPage<MyApp.ViewModels.Search.IndexViewModel> {
/* Generated code */
}
}
以下是错误消息:
Compiler Error Message: CS0246: The type or namespace name 'MyApp' could not be found (are you missing a using directive or an assembly reference?)
您是否知道为什么这适用于Webforms视图引擎但不适用于Razor? 有没有办法告诉编译器使用我的动态加载程序集进行编译?
由于
答案 0 :(得分:2)
你从哪里装你的装配?通常(如我的博客here中所讨论的)如果您没有从/ bin目录加载程序集,则需要确保程序集的路径是可发现的。我以前这样做的方法是使用AppDomain.CurrentDomain.AppendPrivatePath(path)
。虽然这是一种弃用的方法,但您不是自己构建AppDomain(IIS工作进程在托管您的应用程序时执行此操作),您仍然可以使用它来更新当前域以在此处搜索。现在,当一个程序集被解析时,如果它不是GAC,AppDomain将搜索它的私有路径以进行程序集。
至于为什么它适用于WebForms而不是Razor,我们需要更多地了解您的项目架构。
答案 1 :(得分:2)
由于无法找到类型,强类型视图的编译失败时,我遇到了类似的问题。 一种解决方案是创建继承自RazorBuildProvider的自定义构建提供程序:
public class CustomRazorBuildProvider : RazorBuildProvider
{
public override void GenerateCode(System.Web.Compilation.AssemblyBuilder assemblyBuilder)
{
Assembly a = Assembly.LoadFrom([PATH_TO_YOUR_ASSEMBLY]);
assemblyBuilder.AddAssemblyReference(a);
base.GenerateCode(assemblyBuilder);
}
}
然后,您需要在web.config中注册此自定义构建提供程序:
<compilation debug="true" targetFramework="4.0">
<assemblies>
...
</assemblies>
<buildProviders>
<remove extension=".cshtml" />
<add extension=".cshtml" type="YouAssembly.CustomRazorBuildProvider, YourAssembly"/>
</buildProviders>
</compilation>
它有效,但不好的是每次编译视图时都需要引用程序集。
Here,我发布了一个更好的解决方案的问题(例如类似于AppDomain.CurrentDomain.AddPrivatePath),您只需指定一次私有路径,它将在目录级别,而不是在程序集级别