Pergunta

I têm montagem A que depende (estaticamente) do tipo T (tipo de referência, uma classe) em conjunto B.

Eu não possuo assembly A, mas eu faço própria montagem B. T, infelizmente, é um tipo real (não uma interface), mas felizmente Uma reflexão usos para descobrir seus membros.

Eu quero ser capaz de criar dinamicamente B (e T). O item só é importante é que eu preciso ter certeza de que o "B e T" criado dinamicamente (e não os seus membros) são "equivalentes" tho aqueles que foram compilado estaticamente quando A foi compilado.

  1. Eu posso usar a reflexão Emit para criar B e T. Não tem problema.
  2. eu posso escrever B.dll no disco
  3. Se A foi compilado contra esta B.dll então eu posso alterar dinamicamente T, não há problema
  4. No entanto, se um foi compilado contra um equivalente (mão escrito B e T), então o T' em A teria o mesmo nome do assembly eo nome do tipo, mas isso não seria considerado igual ao criado dinamicamente.

Presumo que a razão é a propriedade GUID do tipo. Quando eu escrevo B.dll no disco do tipo T tem o mesmo GUID que o que eu posso criar dinamicamente (mesmo se eu mudar seus membros). No entanto, o tipo de escrita à mão "de outra forma equivalente" não compartilham o mesmo GUID.

Em resumo, o GUID é o mesmo se a DLL vem do criadas dinamicamente, mas é diferente do estaticamente criado. O GUID é o mesmo toda vez (mesmo que eu recompilar). O GUID é o mesmo se eu mudar o conteúdo do tipo dinâmico.

Como o tempo de execução determinar se dois tipos são os mesmos? Como é que esta GUID criado? Ele usa este GUID e / ou alguma outra coisa? É possível atribuir essa GUID na minha montagem dimamic para coincidir com a de montagem de A?

Pode este GUID ser examinado estaticamente (eu não era capaz de vê-lo com refletor ou ildasm).

NOTA:. Suponha que os conjuntos não são assinados

Foi útil?

Solução

O tempo de execução .NET utiliza o nome de montagem, versão, nome forte (se presente), e, em alguns casos, a cultura para localizar conjuntos referenciados. Se uma montagem faz referência a um outro conjunto de B é possível substituir B com um outro conjunto, se as propriedades citadas são exactamente as mesmas. Se B tem um nome forte, você só pode criar outra montagem com o mesmo nome forte se você possui o arquivo de chave que foi usado para assinar o assembly.

AFAIK, a propriedade Type.GUID é utilizado apenas quando seus tipos são registrados para uso COM. Ele funciona com a classe GuidAttribute. Assim, Type.GUID não tem nada a ver com a "identidade" de um tipo.

Você pode ler mais sobre como as assembleias Localiza tempo de execução aqui: http: / /msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top