2010-11-24 12 views
1

OK、私は次のコードビット持って、ファイルまたはアセンブリ」AssemblyBarをロードできませんでしたをバージョン= 1.0.0.0、文化=ニュートラル、PublicKeyToken = null 'またはその依存関係の1つ。システムは、指定されたファイルを見つけることができません。は間接的に反射によりアセンブリにアクセス

問題は、属性の1つがAssemblyFarによって参照されるAssemblyBarにあり、現在のプロジェクト(ProjectBaz)アセンブリによって直接参照されていないことです。 AssemblyFooがユーザーによって選択されているので、私はむしろProjectBazでAssemblyBarを直接参照することを避けたいと思います。これについて正しい方法は何ですか?私はかなり簡単に何かを欠いていると確信しています。

反射鏡がそれをするので可能です。

+0

ここで/どのように 'assembly'を宣言していますか?それをフルパスでロードしていますか? –

+0

関連コードを追加しました。はい、私はフルパスでそれをロードしています。 – jfclavette

答えて

2

Monoのセシル

代わりMono.Cecilのようなツールを使用して、内蔵の反射 施設を通じてアセンブリをロードしないことで問題を回避することがあります。私は分析作業にそれを適用する際に良い経験をしてきました。セシルサイトから

:セシルと

、あなたは、既存の マネージアセンブリをロードするすべての は種類が含まれて閲覧、 場でそれらを変更し、ディスクへ 修正アセンブリを保存することができます。

CCIメタデータ

セシルする代わりに、あなたはCCI Metadata by Microsoft Researchを考えるかもしれません。私はそのツールを使用していないので、Cecilまでスタックする方法についてはコメントできません。

これが役に立ちます。

+0

Mono.Cecilを見ているという私の回答を更新したとき、私はあなたのコメントを見ていませんでした。良いアイデアは、CecilとCCIメタデータです。 –

+0

ありがとうございます。それらの提案は...私が望んでいたものよりも重い。実際にアセンブリを読み込むのは気にしませんが、アセンブリをロードする信頼できる方法はありますか? – jfclavette

+0

@jfclavetteプロジェクトで余分なライブラリ参照が必要ですが、Cecilは使いやすいです。例については、https://github.com/jbevain/cecil/wiki/HOWTOを参照してください。 –

0

あなたがbinディレクトリにAssemblyBarを含めて、clrがそれをロードできるようにすることができます。

+0

ユーザは、実行時にアセンブリを選択し、必要に応じてリフレクタタイプのツールと考えます。 – jfclavette

0

MemberInfo.GetCustomAttributesData()が.NET 4に導入されたため、カスタム属性をインスタンス化せずに調べることができました。

更新:MemberInfo.GetCustomAttributesData()を詳しく見ても、属性をインスタンス化しませんが、アセンブリをロードする必要があります。謝罪いたします。

調査する別の可能なルートは​​です。 Mono.Cecilアセンブリを読み込んで、Monoだけでなく.NET Frameworkで使用することもできます。それはSystem.ReflectionとReflection.Emitよりはるかに強力です。そのホームページによると:

セシルは、画像をイントロスペクションするためにアセンブリをロードするか、互換性のあるアセンブリを持つ必要はありません。

これはまさにあなたがしようとしているようです。

+1

残念ながら、型が現在ロードされているアセンブリにない場合、GetCustomAttributesDataを呼び出すことはできません。 – jfclavette