2009-04-22 10 views
1

のキャストは、私がキャストしようとすると、例外がスローされると、次のシナリオを持っている:反射と

  1. 私はプロジェクト参照を追加し、プロジェクトの名前空間をインポートしました。
  2. LoadFile行は、このプロジェクトのビルド時に生成されたdllをロードします。
  3. dllからオブジェクトのプロパティをデコレートする属性のパブリックフィールドにアクセスしようとしています。ここで
  4. は例外テキストです:

[A] MyNamespace.PropertyMetaDataAttributeは、[B] MyNamespace.PropertyMetaDataAttributeにキャストすることはできません。タイプAは、場所 'C:\ projectA \ bin \ debug \ A.dll'のコンテキスト 'LoadFrom'に 'A、バージョン= 12.0.0.25、Culture = neutral、PublicKeyToken = null'から始まります。タイプBは、 'C:\ currentProject \ bin \ debug \ A.dll'のコンテキスト 'Default'に 'A、Version = 12.0.0.25、Culture = neutral、PublicKeyToken = null'という名前で作成されています。

コードスニペット:あなたの

ConfigurationManager.AppSettings["DLL_File_Path"] 

は、他の場所で同じDLLを指しているので、.NETランタイムがすでにロードされたDLLをロードしようとするよう

using MyNamespace; // added project reference to this item 

m_Assembly = Assembly.LoadFile(ConfigurationManager.AppSettings["DLL_File_Path"]); 

Type objectType = m_Assembly.GetType(string.Format("{0}.{1}", NAMESPACE_PREFIX, "MyObject")); 

// Crash happens on line below: 

Attribute attr = (Attribute) objectType.GetProperty("Name").GetCustomAttributes(false)[0]; 

//This is the layout of the object which has the property 
MyObject 
{ 
    [MyAttribute(Name="FooName")] 
    Foo {get;set;} 
} 

// This is the definition of the attribute 
MyAttribute :Attribute 
{ 
    // Want to access the value 
    public string Name = string.Empty; 
} 

答えて

4

に思え、あなたがそれを使用しようとすると、2つのdllファイルの間でタイプが繰り返されるため、型システムが爆発する...

エラーによれば、t \ currentProject \ビン\デバッグ\のA.DLL

  • C:\ PROJECTA \ビン\デバッグ\のA.DLL
  • 参照した場合HESE 2つのDLLの

    • Cの場所はソリューションに明示的に設定されている場合は、コピーローカルをFalseに設定して、ソリューションが生成されたときに依存関係の結果をコピーしないでください。

    1

    dllがすでに自動的に検索されたパス、binなど)、そのアセンブリで何かを参照したためにロードされた場合、LoadFile (代わりにLoadFromを使用することもできます)、同じDLLをデフォルトではなく別のコンテキスト(LoadFrom-context)にロードします。

    AppDomain.CurrentDomain.GetAssemblies()を参照して、競合を避けるためにDLLを一度だけロードするか、既定のコンテキストからアセンブリをフェッチしてください。

    Defaultコンテキストにないアセンブリにアクセスしようとすると、AssemblyResolve-eventhandlerをフォールバックとしてAppDomain.CurrentDomainにアタッチすることもできます。

    http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

    AppDomain.CurrentDomain.GetAssembliesは()すべてのコンテキストからのアセンブリ、あなたがLoadFrom/LoadFileがを使用してロードされたにもものを含んでいます。

    1

    アセンブリを読み込むときに、型を読み込むためのさまざまなコンテキストがあります。これは、あるタイプから別のタイプにキャストできない理由です。AssemblyResolveイベント(jishiが示唆しているように)を使用してこの問題を回避することもできますし、TypeResolveイベントを使用して正しいタイプを返すこともできますが、実際にアセンブリをアセンブリに合わせる必要があると思います。それがいつ、どのように読み込まれ、どのようなものがあなたにとって正しいのかを理解することができます。

    Suzanne Cookのブログからのこれらの記事は、私がさまざまな文脈やその中に物事がどのように読み込まれているのか、その理由を理解するのを助けました。また

    http://blogs.msdn.com/suzcook/archive/2003/09/19/loadfile-vs-loadfrom.aspx

    http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

    、あなたはどのように、なぜ彼らはあなたが彼らとFusion logsすべての情報をダンプするように設定を確認する必要があります、それはあなたの負荷が表示されます読み込まれているを見てみたい場合はアセンブリの情報。