我正在嘗試編寫一個插件系統,其中程序集可以放在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