我正在尝试编写一个插件系统,可以将程序集放在 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:名称空间“PluginAssembly”中不存在类型或名称空间名称“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
呢?