Question

Je assemblage A qui dépend (statique) du type T (type de référence, une classe) lors de l'assemblage B.

Je ne possède pas l'ensemble A, mais je fais propre assemblée B. T est malheureusement un type réel (pas d'interface) mais heureusement A utilise la réflexion pour découvrir ses membres.

Je veux être en mesure de créer dynamiquement B (et T). Le seul point important est que je dois être sûr que le « B et T » créé de façon dynamique (pas leurs membres) sont « équivalentes » tho celles qui ont été compilés statiquement lorsque A a été compilé.

  1. Je peux utiliser la réflexion pour créer émettons B et T. Pas de problème.
  2. Je peux écrire B.dll sur le disque
  3. Si A a été compilé avec ce B.dll je peux changer dynamiquement T, pas de problème
  4. Toutefois, si A a été compilé avec un équivalent (écrit à la main B et T), le T » en A aurait le même nom de l'assemblage et le nom du type, mais il ne serait pas considéré comme égal à celui créé dynamiquement.

Je suppose que la raison est la propriété GUID du type. Quand j'écris B.dll sur le disque du type T a le même GUID que celui que je peux créer de façon dynamique (même si je ne change pas ses membres). Cependant, le type écrit à la main « sinon équivalent » ne partage pas le même GUID.

En résumé, le GUID est le même si le dll provient de la dynamique créée, mais est différent de celui créé statiquement. Le GUID est le même à chaque fois (même si je recompile). Le GUID est le même si je change le contenu de type dynamique.

Comment le moteur d'exécution ne détermine si deux types sont les mêmes? Comment est-ce GUID créé? Il utilise ce GUID et / ou autre chose? Est-il possible d'attribuer ce GUID dans mon assemblée dimamic pour correspondre à celui de l'assemblage A?

ce GUID peut être examiné de manière statique (je n'ai pas pu le voir avec réflecteur ou ildasm).

NOTE: On suppose les assemblées ne sont pas signés

.
Était-ce utile?

La solution

Le runtime .NET utilise le nom de l'assemblage, la version, nom fort (le cas échéant), et dans certains cas, la culture pour localiser les assemblages référencés. Si un ensemble A fait référence à un autre ensemble B, il est possible de remplacer B par une autre assemblée si les propriétés mentionnées sont exactement les mêmes. Si B a un nom fort, vous ne pouvez créer un autre ensemble avec le même nom fort si vous possédez le fichier clé qui a été utilisé pour signer l'assemblée.

AFAIK, la propriété Type.GUID est utilisé uniquement lorsque vos types sont enregistrés pour une utilisation COM. Il fonctionne avec la classe GuidAttribute. Par conséquent, Type.GUID n'a rien à voir avec la « identité » d'un type.

Vous pouvez en savoir plus sur la façon dont l'exécution localise ensembles ici: http: / /msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top