我正在尝试编写一个插件系统,其中程序集可以放在ASP.NET不知道的文件夹中。此插件系统适用于基于ASP.NET MVC的程序集,但对于旧式WebForm程序集(其中.aspx
文件Inherits
派生类)System.Web.Compilation.BuildManager
负责将.aspx
文件编译为动态程序集。帮助System.Web.Compilation.BuildManager在未引用的程序集中查找类型
我的问题是BuildManager
对我的插件文件夹中的程序集一无所知,似乎完全没有办法帮助它。如果我这样做:
BuildManager.GetType("PluginAssembly.DefinedType", true, true)
它抛出。如果我第一次进入了Type
的引用,然后尝试:
var instance = BuildManager.CreateInstanceFromVirtualPath(path, type);
它仍然抛出,即使我现在在特定type
通过它需要编译.aspx
文件。有什么我可以帮助BuildManager
找到编译.aspx
文件所需的类型?
更新: 我已经更进了一步,通过调查BuildManager.GetType()
实际上做了什么。通过指定组件的类型(例如“PluginAssembly.DefinedType,PluginAssembly”),然后将自己挂接到事件上,我现在可以找到插件程序集并将其返回,以便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”不存在命名空间“PluginAssembly”(?是否缺少程序集引用)”与下列源输出存在:
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-16 14:24:53
因为它需要删除整个网站才能刷新一个插件。此外,它可能不会在中等信任下工作,并且是一个非常糟糕的解决方案。 – 2010-04-22 07:18:00
请注意你正在寻找的答案,但你有没有试过MEF? http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx – 2010-04-23 12:00:46