无法在动态加载的 dll 中将 @model 设置为 class
Can't set @model to class in dynamic loaded dll
我正在开发一个动态加载 dll 的 MVC 项目。在这些 dll 中是其他 MVC 项目(我们称它们为模块)。我们这样做是为了支持模块的即插即用,在不发布整个项目的情况下更新它们。
我们有多个可用的简单模块,现在我在开发一个新模块时遇到了问题。
在模块的所有视图中,我们将模型定义为 @model dynamic
。但是因为我想使用 @Html.TextBoxFor()
否则会导致
An expression tree may not contain a dynamic operation
所以我想,没问题,我会改成 @model ModuleNameSpace.ClassName
但是现在整个视图都无法加载了...异常说:
The view found at '~/PATH_TO_VIEW_FILE' was not created.
使用 @model dynamic
视图可以正常工作,当我创建一个单独的项目时,它也可以使用 @model ModuleNameSpace.ClassName
。所以这似乎是一个问题,因为我们添加了程序集动态?
模块加载如下:
System.Reflection.AssemblyName name = System.Reflection.AssemblyName.GetAssemblyName(module.FullName);
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(name);
我找到了解决问题的方法。问题是模型没有在程序集中找到 class。我不知道确切原因,但我找到了解决它的方法。
您可以为未找到程序集的情况设置一个函数。因为我信任源并且这是一个内部应用程序,所以我可以在 Web 配置中设置完全信任。在解析方法中,我指向模块所在的 dll,然后找到 class 并且它起作用了!
Global.asax:
protected void Application_Start()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var pluginsFolder = GetPluginFolder()
return (from f in pluginsFolder.GetFiles("*.dll", SearchOption.AllDirectories)
let assemblyName = AssemblyName.GetAssemblyName(f.FullName)
where assemblyName.FullName == args.Name || assemblyName.FullName.Split(',')[0] == args.Name
select Assembly.LoadFile(f.FullName)).FirstOrDefault();
}
感谢shawazza
我正在开发一个动态加载 dll 的 MVC 项目。在这些 dll 中是其他 MVC 项目(我们称它们为模块)。我们这样做是为了支持模块的即插即用,在不发布整个项目的情况下更新它们。
我们有多个可用的简单模块,现在我在开发一个新模块时遇到了问题。
在模块的所有视图中,我们将模型定义为 @model dynamic
。但是因为我想使用 @Html.TextBoxFor()
否则会导致
An expression tree may not contain a dynamic operation
所以我想,没问题,我会改成 @model ModuleNameSpace.ClassName
但是现在整个视图都无法加载了...异常说:
The view found at '~/PATH_TO_VIEW_FILE' was not created.
使用 @model dynamic
视图可以正常工作,当我创建一个单独的项目时,它也可以使用 @model ModuleNameSpace.ClassName
。所以这似乎是一个问题,因为我们添加了程序集动态?
模块加载如下:
System.Reflection.AssemblyName name = System.Reflection.AssemblyName.GetAssemblyName(module.FullName);
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(name);
我找到了解决问题的方法。问题是模型没有在程序集中找到 class。我不知道确切原因,但我找到了解决它的方法。
您可以为未找到程序集的情况设置一个函数。因为我信任源并且这是一个内部应用程序,所以我可以在 Web 配置中设置完全信任。在解析方法中,我指向模块所在的 dll,然后找到 class 并且它起作用了!
Global.asax:
protected void Application_Start()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var pluginsFolder = GetPluginFolder()
return (from f in pluginsFolder.GetFiles("*.dll", SearchOption.AllDirectories)
let assemblyName = AssemblyName.GetAssemblyName(f.FullName)
where assemblyName.FullName == args.Name || assemblyName.FullName.Split(',')[0] == args.Name
select Assembly.LoadFile(f.FullName)).FirstOrDefault();
}
感谢shawazza