2011-11-10 10 views
0

私はリフレクションを使用して、NetTierを使用して生成された異なるクラスのメソッドを呼び出すアプリケーションを持っています。IIS7でのアセンブリの反映

Assembly.GetExecutingAssembly().CodeBase 

としてクラスをロードする:

Assembly.LoadFrom(<Assembly Path using above>.dll).GetType(<className>) 

これは、いくつかの動作しているようですが、私は国会実行使用して取得することにより、NetTiersサービスアセンブリをロードしてることを行うために

アセンブリの読み込みに失敗する場合があります。

エラーアセンブリf ROMの実行:C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v4.0.30319 ASP.NETの一時ファイル\サービス\ \ 21d6c367 \ aa208bcd \アセンブリ\ DL3 \ e825b934 \ 00f26fab_a39ecc01 \ .dllがクラス:

とスタックトレース:

System.IO.FileNotFoundException:ファイルまたはアセンブリ「ファイルをロードできませんでした:/// C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v4.0.30319 ASP.NETの一時ファイル\サービス\ \ 21d6c367 \ aa208bcd \ assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dll 'またはその依存関係の1つです。システムは、指定されたファイルを見つけることができません。ファイル名: 'file:/// C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ services \ 21d6c367 \ aa208bcd \ assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dll'

System.Reflection.RuntimeAssembly._nLoad(のAssemblyNameファイル名、文字コードベース、証拠assemblySecurity、RuntimeAssembly locationHint、StackCrawlMark & stackMark、ブールthrowOnFileNotFound、ブールforIntrospection、ブールsuppressSecurityChecks)System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(のAssemblyName assemblyRef、証拠assemblySecurity、ATで

StackCrawlMark & stackMark、イントロスペクションのブール値、ブールsuppressSecurityChecks)

at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFi System.Reflection.Assembly.LoadFrom(文字列assemblyFile)でル、証拠securityEvidence、バイト[]ハッシュ値、AssemblyHashAlgorithm hashAlgorithm、ブールforIntrospection、ブールsuppressSecurityChecks、StackCrawlMark & stackMark)

WRN:アセンブリは、ログを結合が投入されますオフ。アセンブリバインドの失敗のログを有効にするには、レジストリ値[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)を1に設定します。注:アセンブリバインドの失敗のログには、パフォーマンス上のペナルティがあります。この機能を無効にするには、レジストリ値[HKLM \ Software \ Microsoft \ Fusion!EnableLog]を削除します。

アセンブリからクラスをロードするには、より良い方法がありますか、他のクラスではこのエラーが発生するようなものがありませんか? IIS7を使用してアプリケーションを実行しています。あなたはDLLの名前を指定していないことを確認することができ、指定されたパスから

答えて

0

\.dll

+0

アセンブリへのパスに.dllを指定しています。 – Steve

+0

@Steve "匿名でホストされた"アセンブリを介して、いくつかの動的コードからの呼び出しです。または、少なくとも実際の呼び出しがインライン展開されています。ただし、クラス名がアセンブリ修飾されている場合、まずアセンブリをロードする必要はありませんそうでなければ、このパターンは信頼できず、より安全なものが必要ですアセンブリを事前に知る方法。 'GetEntryAssembly()'はより信頼できますが、必ずしも正しいとは限りません。 –

1

はアセンブリをロードするには

Assembly.Load(Assembly.GetExecutingAssembly().GetName()) 

を使用してみてください参照してください。

しかし、私はGetExecutingAssemblyが必ずしもJITインライン化などの理由で信頼できるとは限りません。同じ理由でGetCallingAssemblyとなります。 GetEntryAssemblyはおそらく良いですが、Webアプリケーションでは、Global.asaxのおかげで動的に生成される別のアセンブリである可能性が高くなります。つまり、コードに直接コードが含まれているとは限りません。

アセンブリの名前をあらかじめ知っていて、上のようにAssembly.Load(AssemblyName)メソッドを使用すれば、ファイル名を気にする必要はありません。良いアイデア - ランタイムがロードされる場所とは異なる場所からロードすると、メモリ内に重複するアセンブリを得ることができます。

関連する問題