Pregunta

Tengo conjunto A que depende (estáticamente) del tipo T (tipo de referencia, una clase) en el montaje B.

No soy dueño de ensamblaje A, pero sí me pertenecen montaje B. T lamentablemente es un tipo real (no una interfaz) pero por suerte Un utiliza la reflexión para descubrir sus miembros.

Quiero ser capaz de crear dinámicamente B (y T). El único punto importante es que necesito para estar seguro de que la "B y T" crea de forma dinámica (no son sus miembros) son "equivalentes" aunque los que fueron compilados estáticamente cuando se compiló A.

  1. Puedo utilizar la reflexión para crear emiten B y T. No hay problema.
  2. Puedo escribir en el disco B.dll
  3. Si A fue compilada en este B.dll entonces yo puedo cambiar dinámicamente T, no hay problema
  4. Sin embargo, si A fue compilado contra un equivalente (escrito a mano B y T), entonces la T' en A tendría el mismo nombre de ensamblado y nombre de tipo pero no sería considerado igual a la creada dinámicamente.

Asumo que la razón es la propiedad GUID del tipo. Cuando escribo B.dll en el disco del tipo T tiene el mismo GUID que la que yo puedo crear dinámicamente (incluso si cambio de sus miembros). Sin embargo, el tipo de escrito a mano "por lo demás equivalentes" no comparte el mismo GUID.

En resumen, el GUID es el mismo si el DLL proviene de la dinámica creada, pero es diferente de la que forma estática creada. El GUID es la misma hora todos (incluso si recompilar). El GUID es el mismo si se cambia el contenido del tipo dinámico.

¿Cómo determina el tiempo de ejecución si dos tipos son los mismos? ¿Cómo se crea este GUID? Se utiliza este GUID y / o alguna otra cosa? ¿Es posible asignar este GUID en mi ensamblaje dimamic para que coincida con el de conjunto A?

Puede este GUID se examinará de forma estática (que no era capaz de verlo con reflector o ildasm).

NOTA: Se supone asambleas no están firmados

.
¿Fue útil?

Solución

El tiempo de ejecución .NET utiliza el nombre de ensamblado, versión, nombre fuerte (si está presente), y en algunos casos la cultura para localizar ensamblados de referencia. Si un conjunto A hace referencia a otro ensamblado B es posible reemplazar B con otra asamblea si las propiedades mencionadas son exactamente los mismos. Si B tiene un nombre seguro sólo se puede crear otro montaje con el mismo nombre fuerte si es el propietario del archivo de la clave que se utilizó para firmar el ensamblado.

Que yo sepa, la propiedad Type.GUID sólo se utiliza cuando los tipos están registrados para su uso COM. Se trabaja con la clase GuidAttribute. Por lo tanto, Type.GUID no tiene nada que ver con la "identidad" de un tipo.

Puede leer más acerca de cómo el tiempo de ejecución localiza ensamblados aquí: http: / /msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top