2009-07-03 9 views
1

ASP.NETアプリケーションでは、完全修飾文字列参照でType.GetType()を使用し、その型のオブジェクトをインスタンス化することによって、「モジュール」システムを利用します。ビン内のASP.NETアンロードアセンブリ

しかし、最近ではタイプを見つけることができないという例外が投げられていますが、時折しかありません。私は自由に複製することができませんでしたが、通常、マスターページやASCXマークアップのようなビン以外のものに簡単に変更した後に発生します。サイトを再構築するかIISを再起動するまでは、自分自身を分類しません。 web.configに変更を加えても修正されません。

web.config内のアセンブリへの明示的な参照を追加することは、binディレクトリに置かれていることを望んでいるのではなく、問題の発生を減らしますが、完全に発生することを防ぎません。どういうわけか、どこかで私のアセンブリを削除することをお勧めします。

以前のページの読み込みにもかかわらず、タイプが見つからない場所にデバッグしましたが、アセンブリはThread.GetDomain().GetAssemblies()から消えているようです。明らかに、私はアプリケーションが稼働しているときにこれが起こる危険性はないので、私は手作業でDLLをAssembly.LoadAssembly()と呼んでいましたが、アセンブリを探す方法を作る価値があるかどうかを知るために必要でした。

xxx.Modules.CustomCaseStudy が [B]にキャストすることはできません[A]がxxx.Modules.CustomCaseStudy:それは次のエラーを投げたとして、私はクラスを使用しようとしたとき、これは、いずれかの動作しませんでした。 を入力コンテキスト で 'xxx.Modules、 バージョン= 1.0.0.0、文化=中立、 なPublicKeyToken = nullを' に由来する 'LoadNeither' 場所 「Cで:\開発\ XXX \ xxx.Web \ビン\ xxx.Modules.dll '。 タイプBは、 'C:\ WINDOWS \ Microsoft.NET \ Framework \ v2'のコンテキストで 'xxx.Modules、 バージョン= 1.0.0.0、Culture =ニュートラル、 PublicKeyToken = null'から発信されます。 0.50727 \ Temporary ASP.NET Files \ root \ fff474e0 \ 8c6aec7e \ assembly \ dl3 \ 325b4335 \ 009dbd67_b2fbc901 \ xxx.Modules.DLL '。

すべての間、必要なDLLは、web.configの明示的な参照はもちろんのこと、使用を控えて、待っています。

犯人を追跡するための情報、または最後の手段として、そのアセンブリを「デフォルト」のコンテキストにロードする方法についても、非常に感謝しています。

答えて

2

:web.configファイルに

<add assembly="*"/>

をし、2週間以上のサイトを使用し、私はこれに実行していませんもう一度問題。私はそれがどんなところでもビンにすべてをロードするようにしたいので、それは見た目のように凶暴な解決策ではありません!

+0

これは.NET 4.5で私にとってはうまくいきませんでした。 [This](http://stackoverflow.com/questions/3552223/asp-net-appdomain-currentdomain-getassemblies-assemblies-missing-after-app)は役に立ちました。 –

0
  1. Thread.GetDomain()。GetAssemblies()は、 "bin"フォルダ内のアセンブリのすべてを返しません。これまで使用されていたアセンブリのみを返します。これはあなたが望むものではありません。 Assembly.LoadAssembly()を呼び出す必要があります。

  2. クラスを動的にロードする場合は、他のコードで強く型付けされた参照を使用しないでください。だからこそ、あなたは「キャストできません」例外を取得しています。これを回避する方法の1つは、すべてのモジュールが実装するインターフェイスを定義することです。そして、あなたが "モジュール"クラスの一つを動的にロードするときはいつも、それをこのインターフェースのインスタンスとして返します。何かのようなもの...行を追加した後

public IModule GetModule(string className) 
{ 
    // Load the assembly 
    // Find the type 
    // Call CreateInstance 
    // Cast the return value as "IModule" and return it 
} 
+0

Davidさん、ありがとうございましたが、私の問題はアセンブリをロードしていません。サイトは長年にわたって正常に動作し、一部のアセンブリはアンロードされ、元に戻されません。 – tags2k