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'は名前空間'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
なりますか?