2009-04-12 11 views
1

アセンブリBの型T(参照型、クラス)に(静的に)依存するアセンブリAがあります。.NETランタイムは、2つのタイプが同じであることをどのように判断しますか?

私はアセンブリAを所有していませんが、アセンブリBを所有しています。幸運にもAはリフレクションを使ってそのメンバーを発見します。

B(とT)を動的に作成したいと考えています。唯一重要なのは、AとBを動的に作成したメンバー(メンバーではない)が、Aがコンパイルされたときに静的にコンパイルされたものと同等であることを確認する必要があることです。

  1. 反射Emitを使用してBとTを作成できます。問題ありません。 Aは、Aが(手書きBおよびT)等価に対して、コンパイルされている場合、私は動的T、問題なくしかしながら
  2. を変更することができ、このB.DLLに対してコンパイルされた場合
  3. Iディスク
  4. にB.DLLを書き込むことができますAのT 'は同じアセンブリ名と型名を持ちますが、動的に作成されたものとはみなされません。

その理由がその型のGUIDプロパティであると仮定します。 B.dllをディスクに書き込むと、Tタイプは、たとえメンバを変更しても、動的に作成できるものと同じGUIDを持ちます。しかし、「それ以外の同等の」手書き型は、同じGUIDを共有しません。

要約すると、動的に作成されたものの、静的に作成されたものとは異なる場合、GUIDは同じです。 GUIDは毎回同じです(再コンパイルしても同じです)。動的タイプの内容を変更すると、GUIDは同じになります。

ランタイムは、2つのタイプが同じかどうかをどのように判断しますか?このGUIDはどのように作成されますか?このGUIDなどを使用していますか?このGUIDをアセンブリのAに一致させるために私のdimamicアセンブリに割り当てることは可能ですか?

このGUIDを静的に調べることができますか(反射器またはildasmで見ることはできませんでした)。

注:アセンブリが署名されていないと仮定します。

答えて

4

.NETランタイムは、アセンブリ名、バージョン、厳密な名前(存在する場合)、および場合によっては参照されたアセンブリを見つけるためのカルチャを使用します。アセンブリAが別のアセンブリBを参照する場合、上記のプロパティがまったく同じ場合は、Bを別のアセンブリに置き換えることができます。 Bに強い名前がある場合は、アセンブリに署名するために使用されたキーファイルを所有している場合にのみ、同じ名前の別のアセンブリを作成できます。

AFAIKでは、Type.GUIDプロパティは、タイプがCOM用に登録されている場合にのみ使用されます。これはGuidAttributeクラスで動作します。したがって、Type.GUIDは型の「身元」とは何の関係もありません。

ここで、ランタイムがアセンブリをどのように配置するかについて詳しく読むことができます:http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

関連する問題