Frage

I habe Baugruppe A, die (statisch) vom Typ T (Referenz-Typ, eine Klasse) hängt in Anordnung B.

Ich habe keine Anordnung A besitzen aber ich eigene Montage B. T leider ein echter Typ ist (keine Schnittstelle), aber zum Glück A verwendet Reflektion seiner Mitglieder zu entdecken.

Ich möchte in der Lage sein, dynamisch zu erstellen B (und T). Die einzige wichtige Punkt ist, dass ich sicher sein müssen, dass die „B und T“ dynamisch erstellt (nicht ihre Mitglieder) sind „gleichwertig“ tho diejenigen, die statisch kompiliert wurden, als A kompiliert wurde.

  1. Ich kann mithilfe von Reflektion Emit B und T. kein Problem schaffen.
  2. Ich kann B.dll auf die Festplatte schreiben
  3. Wenn A gegen diesen B.dll kompiliert wurde, dann kann ich dynamisch ändern T, kein Problem
  4. Wenn jedoch A gegen einen gleichwertigen kompiliert wurde (Hand geschrieben B und T), dann würde die T‘in A die gleichen Montagenamen und Typnamen haben, aber es wäre dynamisch erstellt zum einen nicht als gleich betrachtet werden.

Ich gehe davon aus, dass der Grund die GUID-Eigenschaft auf dem Typ ist. Wenn ich B.dll auf der Festplatte des T-Typ hat die gleiche GUID als das schreibe ich dynamisch erstellen kann (auch wenn ich seine Mitglieder ändern). Doch die „ansonsten gleichwertig“ handgeschriebene Art nicht die gleiche GUID nicht teilt.

Insgesamt ist die GUID die gleiche, wenn die DLL aus dem dynamisch erstellt kommt, unterscheidet sich aber von dem einen statisch angelegt. Die GUID ist jedes Mal die gleiche (auch wenn ich neu kompilieren). Die GUID ist das gleiche, wenn ich den Inhalt des dynamischen Typs ändern.

Wie wirkt sich die Laufzeit festzustellen, ob zwei Typen gleich sind? Wie wird diese GUID erstellt? Es verwendet diese GUID und / oder etwas anderes? Ist es möglich, diese GUID in meinem dimamic Baugruppe zuzuweisen, die eine in der Montage A Übereinstimmen?

Kann diese GUID statisch geprüft werden (ich war nicht in der Lage es mit Reflektor oder ildasm zu sehen).

Hinweis: Es sei angenommen, Baugruppen sind nicht signiert

.
War es hilfreich?

Lösung

Die .NET-Laufzeit verwendet den Namen der Assembly, Version, starken Namen (falls vorhanden), und in einigen Fällen die Kultur referenzierten Assemblys zu finden. Wenn eine Baugruppe Eine andere Anordnung B referenziert ist es möglich, B mit einer anderen Baugruppe zu ersetzen, wenn die genannten Eigenschaften sind genau die gleichen. Wenn B einen starken Namen hat, können Sie nur eine weitere Baugruppe mit dem gleichen starken Namen erstellen, wenn Sie die Schlüsseldatei besitzen, die verwendet wurde um die Anordnung zu unterschreiben.

AFAIK ist die Type.GUID Eigenschaft nur verwendet, wenn Ihre Typen für COM Verwendung registriert sind. Es arbeitet 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 lokalisiert Baugruppen hier: http: / /msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top