2009-04-12 15 views
1

Ich habe Baugruppe A, die (statisch) vom Typ T (Referenz-Typ, eine Klasse) in der Montage B.Wie bestimmt die .NET-Laufzeit, dass zwei Typen gleich sind?

I nicht besitzen Baugruppe A aber ich eigene Montag B. T Leider ist ein echter Typ (nicht hängt eine Schnittstelle), aber glücklicherweise verwendet A Reflexion, um seine Mitglieder zu entdecken.

Ich möchte in der Lage sein, dynamisch B (und T) zu erstellen. Der einzige wichtige Punkt ist, dass ich sicher sein muss, dass die dynamisch erzeugten "B und T" (nicht ihre Mitglieder) "äquivalent" sind zu denen, die statisch kompiliert wurden, als A kompiliert wurde.

  1. Ich kann Reflection Emit verwenden, um B und T zu erstellen. Kein Problem.
  2. kann ich B.dll auf die Festplatte
  3. schreiben Wenn A gegen diesen B.dll kompiliert wurde, dann kann ich dynamisch T ändern, kein Problem
  4. Allerdings, wenn A gegen ein Äquivalent kompiliert wurde (Hand geschrieben B und T) dann würde das T 'in A den gleichen Assemblynamen und Typnamen haben, aber es würde nicht als gleich dem dynamisch erzeugten betrachtet werden.

Ich nehme an, dass der Grund die GUID-Eigenschaft auf dem Typ ist. Wenn ich B.dll auf Platte schreibe, hat der T-Typ die gleiche GUID als die, die ich dynamisch erzeugen kann (selbst wenn ich seine Mitglieder ändere). Der handschriftliche Typ "ansonsten gleichwertig" teilt jedoch nicht die gleiche GUID.

Zusammenfassend ist die GUID die gleiche, wenn die DLL von der dynamisch erstellt stammt, ist aber anders als die eine statisch erstellt. Die GUID ist jedes Mal gleich (auch wenn ich neu kompiliere). Die GUID ist die gleiche, wenn ich den Inhalt des dynamischen Typs ändere.

Wie bestimmt die Laufzeit, ob zwei Typen gleich sind? Wie wird diese GUID erstellt? Es nutzt diese GUID und/oder etwas anderes? Ist es möglich, diese GUID in meiner Dimamic-Assembly der in Assembly A zuzuordnen?

Kann dieser GUID statisch untersucht werden (ich konnte es nicht mit Reflector oder ildasm sehen).

HINWEIS: Angenommen, Baugruppen sind nicht signiert.

Antwort

4

Die .NET-Laufzeit verwendet den Assemblynamen, die Version, den starken Namen (falls vorhanden) und in einigen Fällen die Kultur, um referenzierte Assemblys zu lokalisieren. Wenn eine Baugruppe A auf eine andere Baugruppe B verweist, ist es möglich, B durch eine andere Baugruppe zu ersetzen, wenn die genannten Eigenschaften genau gleich sind. Wenn B einen starken Namen hat, können Sie nur dann eine andere Assembly mit demselben starken Namen erstellen, wenn Sie die Schlüsseldatei besitzen, die zum Signieren der Assembly verwendet wurde.

AFAIK, die Type.GUID-Eigenschaft wird nur verwendet, wenn Ihre Typen für die COM-Verwendung registriert sind. Es funktioniert mit der GuidAttribute-Klasse. Daher hat Type.GUID nichts mit der "Identität" eines Typs zu tun.

Sie können mehr darüber lesen, wie die Laufzeit Baugruppen hier findet: http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Verwandte Themen