.NET ランタイムは 2 つの型が同じであることをどのように判断するのでしょうか?

StackOverflow https://stackoverflow.com/questions/742053

質問

アセンブリ B の型 T (参照型、クラス) に (静的に) 依存するアセンブリ A があります。

私はアセンブリ A を所有していませんが、アセンブリ B を所有しています。残念ながら T は実際の型 (インターフェイスではありません) ですが、幸いなことに A はリフレクションを使用してそのメンバーを検出します。

動的にB(とT)を作成できるようにしたいです。唯一重要な項目は、動的に作成された「B および T」(そのメンバーではない)が、A のコンパイル時に静的にコンパイルされたものと「同等」であることを確認する必要があることです。

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

その理由は、型の GUID プロパティであると考えられます。B.dll をディスクに書き込むと、T 型の GUID は、(メンバーを変更した場合でも) 動的に作成できるものと同じになります。ただし、「それ以外は同等」の手書きタイプは同じ GUID を共有しません。

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

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

この GUID は静的に検査できますか (Reflector や ildasm では確認できませんでした)。

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

役に立ちましたか?

解決

.NETランタイムは、アセンブリ名、バージョン、強い名(存在する場合)を使用し、そしていくつかの場合には、培養は、参照アセンブリを配置します。アセンブリAは、別のアセンブリBを参照している場合には、前述の特性が全く同じであれば、別のアセンブリとBを交換することが可能です。 Bは、厳密な名前を持っている場合は、アセンブリに署名するために使用された鍵ファイルを所有している場合にのみ、同じ厳密な名前で別のアセンブリを作成することができます。

あなたのタイプはCOMの使用のために登録されている場合、

私の知る限り、Type.GUIDプロパティにのみ使用されます。これは、GuidAttributeクラスで動作します。したがって、Type.GUIDはタイプの「同一性」とは何の関係もありません。

ます。http:/

あなたはランタイムがここにアセンブリを検索する方法についての詳細を読むことができます/msdn.microsoft.com/en-us/library/yx7xezcf.aspxする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top