我正在尝试编写一个插件系统,其中程序集可以放在ASP.NET不知道的文件夹中。此插件系统适用于基于ASP.NET MVC的程序集,但对于传统的WebForm程序集( .aspx文件Inherits System.Web.UI.Page派生类),System.Web.Compilation.BuildManager负责将.aspx文件编译成动态程序集。
我的问题是,BuildManager对我的插件文件夹中的程序集一无所知,而且我完全无法帮助它。如果我这样做了:
BuildManager.GetType("PluginAssembly.DefinedType", true, true)它扔了。如果我首先获得对Type的引用,然后尝试:
var instance = BuildManager.CreateInstanceFromVirtualPath(path, type);它仍然抛出,尽管我现在已经传入了特定的type,它需要编译.aspx文件。有什么可以帮助BuildManager找到编译.aspx文件所需的类型吗?
更新:--我进一步了解了BuildManager.GetType()的实际功能。通过指定在其中定义类型的程序集(如"PluginAssembly.DefinedType,PluginAssembly"),然后将自己连接到System.AppDomain.CurrentDomain.AssemblyResolve事件,我现在可以找到插件程序集并返回它,以便BuildManager能够成功地构造该类型。这使得下面的工作非常出色:
BuildManager.GetType("PluginAssembly.DefinedType, PluginAssembly", true, true)然而,这仍然失败了:
var instance = BuildManager.CreateInstanceFromVirtualPath(path, type);尽管.aspx文件现在在其Inherits指令中具有相同的程序集引用:
<%@ Page Language="C#"
CodeBehind="Index.aspx.cs"
Inherits="PluginAssembly.DefinedType, PluginAssembly" %>我收到的错误是:
编译器错误消息: CS0234:名称空间'DefinedType‘中不存在类型或名称空间名称’DefinedType‘(您缺少程序集引用吗?)具有以下源输出:
Line 205:
Line 206: [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
Line 207: public class plugins_pluginassembly_dll_index_aspx
: global::PluginAssembly.DefinedType,
System.Web.SessionState.IRequiresSessionState,
System.Web.IHttpHandler {
Line 208:
Line 209: private static bool @__initialized;BuildManager.CreateInstanceFromVirtualPath()内部发生的事情似乎涉及到一个特定的System.Web.Util.IWebObjectFactory,它可能负责通过找不到我的程序集抛出这个异常。我可以在没有任何问题的情况下实现这个接口,但是如果我不能告诉BuildManager这个接口有什么帮助呢?
发布于 2010-04-26 17:08:28
最后,我用Web部署项目 [1]解决了这个问题,方法是将整个web应用程序预编译成两个独立的程序集,然后使用Assembly.GetTypes()深入到正确的程序集中,为给定的Page请求实例化正确的Page。
它让插件开发人员承担更多的责任,但是在(安全敏感和脆弱的) web上下文中执行所有插件之前,让ASP.NET编译器对所有插件进行完全验证,从而获得更好的性能。
发布于 2010-04-23 13:25:25
我看到了两种可以指定用于编译页面的程序集的方法:
发布于 2010-04-26 05:17:40
我不知道BuildManager是如何加载类型的,但是您可以尝试使用AssemblyResolve --订阅AppDomain.CurrentDomain.AssemblyResolve事件,自己加载程序集并返回(是的,返回) Assembly实例(如果不识别的话返回null )。
并非所有这样的代码都使用与此兼容的方法,但值得一试。
https://stackoverflow.com/questions/2652289
复制相似问题