Domanda

Ho assembly A che dipende (staticamente) su tipo T (tipo di riferimento, una classe) nell'assemblaggio B.

Non possiedo il montaggio A, ma lo faccio propria assemblea B. T purtroppo è un vero e proprio tipo (non un'interfaccia) ma per fortuna A utilizza la reflection per scoprire i suoi membri.

Voglio essere in grado di creare dinamicamente B (e T). L'unico elemento importante è che ho bisogno di essere sicuro che il "B e T" creato in modo dinamico (non i loro membri) sono "equivalenti" tho quelli che sono stati compilati staticamente quando A è stato compilato.

  1. posso usare riflessione emettono per creare B e T. Nessun problema.
  2. posso scrivere B.dll su disco
  3. Se A è stato compilato contro questo B.dll allora posso cambiare dinamicamente T, non è un problema
  4. Tuttavia, se A è stato compilato contro un equivalente (scritto a mano B e T), allora il T' in A avrebbe lo stesso nome di montaggio e nome del tipo, ma non sarebbe stato considerato uguale a quello creato in modo dinamico.

Suppongo che il motivo è la proprietà GUID del tipo. Quando scrivo B.dll disco del tipo T ha lo stesso GUID quello posso creare dinamicamente (anche se cambio suoi membri). Tuttavia il tipo di scritta a mano "altrimenti equivalente" non condivide lo stesso GUID.

In sintesi, il GUID è lo stesso se la DLL viene dal creato in modo dinamico, ma è diverso da quello creato in modo statico. Il GUID è lo stesso tempo ogni (anche se io ricompilare). Il GUID è la stessa se cambio il contenuto del tipo dinamico.

In che modo il runtime determinare se due tipi sono la stessa cosa? Come nasce questo GUID? Esso utilizza questo GUID e / o qualcos'altro? E 'possibile assegnare questo GUID nella mia assemblea dimamic per corrispondere a quello del gruppo di A?

Può questo GUID essere esaminato in modo statico (non ero in grado di vedere con riflettore o ildasm).

NOTA: assumere le assemblee non sono firmati

.
È stato utile?

Soluzione

Il runtime .NET utilizza il nome assembly, versione, nome sicuro (se presente), e in alcuni casi la coltura per individuare assembly riferimento. Se un assieme Un riferimento a un'altra complesso B è possibile sostituire con un altro assieme B se le proprietà di cui sono esattamente gli stessi. Se B ha un nome sicuro è possibile creare solo un altro assieme con lo stesso nome sicuro se si possiede il file di chiave che è stato utilizzato per firmare l'assembly.

Per quanto ne so, la proprietà Type.GUID viene utilizzato solo quando i tipi sono registrati per l'uso COM. Funziona con la classe GuidAttribute. Quindi, Type.GUID non ha nulla a che fare con l ' "identità" di un tipo.

Si può leggere di più su come il runtime individua gli assembly qui: http: / /msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top