2009-07-16 7 views
4

私はアセンブリを読み込み、アプリケーションが参照する別のアセンブリA1で定義されたクラスC1のサブクラスである型を探します。私はC1のサブクラスであるA1の型Tを定義しましたが、Assembly.Load(...)を使用してA1をロードし、Tのインスタンスでt.IsSubclassOf(typeof(C1))を呼び出すと、falseになります。私は、現在のappdomainにアセンブリA1のインスタンスが2つあり、インスタンスC1からタイプC1を取得しても両方を取得しないと、t.IsSubclassOf(C1)が動作することに気付きました。私はこの行動をかなり理解していない、誰も説明することができますか?さらに、どのようにしてA1や他のアセンブリをロードしてC1のサブタイプを探すかにかかわらず、私のアプリを修正することができますか?Type.IsSubclassOfが期待どおりに動作しない

答えて

5

CLRが型を一意に識別するために、型識別子にアセンブリ情報が含まれています。あなたの問題は、CLRは、したがって、あなたが効果的に実行され、異なるアセンブリとしてA1の2つのインスタンスを分類していることである。

A1::T1.IsSubClassOf(A1Copy::C1) // No relationship between A1 and A1Copy 

...代わりに:アセンブリは一意で識別され

A1::T1.IsSubClassOf(A1::C1) 

その名前、バージョン、カルチャ、および公開鍵。 app-domain内の両方のアセンブリインスタンスからこれらの値を確認してください(Assembly.GetName()経由)。私は、属性の1つに不一致があり、CLRが問題のアセンブリをロードする原因になっていると思われます。

+2

は、詳細はこちらの記事をチェックしてください。 http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx – user7116

2

うん、私はちょうどこの2つのプロジェクトを構築し、私は1人のプロジェクトの親と子クラスで定義された:

namespace ClassLibrary1 
{ 
    public class Parent 
    { 
     public string name; 
    } 

    public class Child : Parent 
    { 
    } 
} 

して、情報をロードしようとした:

{ 
     Type parent = typeof(Parent); 
     Type c1 = typeof(Child); 
     bool isChild1 = (c1.IsSubclassOf(parent).ToString()); 

     Assembly a = Assembly.Load(File.ReadAllBytes("ClassLibrary1.dll")); 
     Type c2 = a.GetType(c1.FullName); 
     bool isChild2 = (c2.IsSubclassOf(parent).ToString()); 
    } 

と私は を得ましたisChild1が真、isChild2が偽です。あなたが問題を引き起こしている可能性があります(Assembly.Load()を使用して)にアセンブリをロードしている

http://blogs.msdn.com/suzcook/archive/2003/06/13/57180.aspx

0

のAppDomain:

いくつかのより多くの光を提供するロードコンテキストのスザンヌ・クックによって、このリンクをチェックアウト。

Assembly.Load()の代わりにAppDomain.CurrentDomain.Load()を使用してください。これにより、実際にアセンブリを使用できるCurrentDomainにアセンブリが確実にロードされます。等しくないとして、彼はそれらを取得している理由それは、ロードコンテキストに基づいています

http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx

+0

私は最初のリンクをたどり、StackOverflowExceptionを取得しました。 –

関連する問題