2

管理者がプラグインをアップロードできるようにするWebベースのアプリケーションを開発しています。すべてのプラグインは、アプリルートの外部の特別なフォルダー(C:\ Pluginsなど)に保存され、Assembly.LoadFrom()を介して動的にロードされます。これはほとんどの場合問題なく機能します。プラグインのWebControlはインスタンス化されて読み込まれ、カスタムクラスは期待どおりに機能します。

カスタムVirtualPathProviderを使用して、これらのプラグインからリソースを取得しています。したがって、埋め込みASPXファイルを取得するには、「/ MySite / embeddedResource /?Assembly = MyPlugin&Resource=MyPage.aspx」のようにします。そして、それも問題なく機能します。埋め込まれたASPXファイルはコンパイルされ、通常のページのように提供されます。

ただし、問題は、埋め込まれた.aspxファイル(動的にロードされたプラグイン内)が同じプラグインアセンブリ内のクラスを参照する場合に発生します。「タイプまたはアセンブリMyPluginが見つかりません」などのコンパイルエラーが発生します。これは奇妙なことです。明らかに、MyPluginから.aspxファイルを引き出しているからです。それで、どうしてそれを見つけることができないのでしょうか?

だから、私はあなたがこれで私を助けることができることを願っています。プラグインは次のようになります。

MyPlugin.dll:

  • InternalHelperClass.cs
  • MyPage.aspx(.csファイルのないリソース)

MyPage.aspxに「<%= InternalHelperClass.WriteHelloWorld()%>」のようなものが含まれている場合、コンパイルは失敗します。

どうすればこれを機能させることができますか?

アップデート:

完全修飾名を使用してみました。変わりはない。ステップスルーすることは不可能です-aspxページに移動するとコンパイルエラーになります。この場合、名前空間は問題になりません(外部プラグインdllからのものであるため)

UPDATE2:

ジョエル、あなたは何かに夢中だと思います。残念ながら、これらのアセンブリを含めるようにweb.configを編集することは、設計の一部ではありません。基本的に、プラグインは完全に動的である必要があります。プラグインをフォルダーにドロップし、アプリを再起動して、準備を整えます。

4

3 に答える 3

3

Assembly.LoadFromは動的(レイトバウンド)です。つまり、コンパイル時に型が含まれないため、含まれているクラスへの参照は無効です。* .aspxクラスのコンパイルの一部として含まれるように、アセンブリを具体的に参照する必要があります。

ここでソースコードの一部が役立つ場合があります。この問題はすでに解決されている可能性があるため、ManagedExtensibilityFrameworkを試してみることをお勧めします。

更新:私はあなたの問題に対する答えだと思うものを見つけました。これはASP.NET1.1プロジェクトでは機能しませんが、2.0以降では機能します。彼らは、構成ファイル(web.config)で指定できるBuildProviderを使用するように、ビルドパイプラインを再構築しました。独自のビルドプロバイダーを作成する必要がありますが、コンパイル前にPluginsフォルダー内のすべてのアセンブリを自動的に参照するビルドプロバイダーを作成できます。構成に関する情報と、それを行うためにサブクラス化する必要があるものは次のとおりです。

これは、 MonoのPageBuildProviderのソースコードの古いコピーです。残念ながら、クラスは封印されているため、MSの共有ソースからASP.NETの最新の実装を確認してコピーし、カスタムアセンブリ参照で拡張する必要があります(しかし、それほど複雑には見えません)。

于 2008-10-03T14:09:17.240 に答える
0

ヘルパー クラスの名前空間を完全修飾しようとしましたか? 公開ですか?それは同じアセンブリにありますか?おそらく、同様にロードする必要がある別のアセンブリにあります。

コードにステップ インして、InternalHelperClass のタイプを調べてみてください。コンパイルの新しい「Web サイト」メソッドでは、予期しない名前空間が追加されることがよくあります。たとえば、Web ページのクラスには名前空間 ASP.MyWebPage があります。また、存在するフォルダーに基づいて名前空間が追加されることもあります。

于 2008-10-02T17:21:49.347 に答える
0

私はこれを試みたことはありませんが、あなたの ASPX ページは、プラグイン アセンブリから読み込まれますが、プラグイン アセンブリへの参照を持たない ASP.NET 環境でコンパイルされていると思われます。修飾名は機能しません。

Web.config ファイルのコンパイル/アセンブリ タグに MyPlugin.dll への参照を追加しようとしましたか?

于 2008-10-02T19:13:04.010 に答える