Como Faço para Carregar um Assembly e Todas as suas Dependências em tempo de execução em C# para a Reflexão?

StackOverflow https://stackoverflow.com/questions/59220

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu estou escrevendo um utilitário para mim, em parte, como um exercício de aprendizagem C# Reflexão e, em parte, porque na verdade eu quero que a ferramenta resultante para meu próprio uso.

O que eu estou atrás é, basicamente, apontando o aplicativo em uma assembléia e a escolha de uma determinada classe a partir da qual selecionar propriedades que devem ser incluídos em um HTML exportado forma como campos.De que forma será então usado no meu ASP.NET MVC aplicativo como o início de um modo de Exibição.

Como eu estou usando Subsónico objetos para aplicações em que eu quero usar, este deve ser razoável e eu percebi que, por querer incluir coisas como diferentes HTML de saída, dependendo do tipo de dados, a Reflexão é o caminho para conseguir este feito.

O que eu estou procurando, no entanto, parece ser difícil.Eu estou a tentar fazer a DLL/EXE que é escolhido por meio de um OpenFileDialog como o ponto de partida e de carga-lo:

String FilePath = Path.GetDirectoryName(FileName);
System.Reflection.Assembly o = System.Reflection.Assembly.LoadFile(FileName);

Que funciona bem, mas porque Subsônicas-objetos gerados na verdade estão cheios de tipos de objetos que são definidos em Subsonic.dll, etc., os objetos dependentes não são carregados.Enter:

AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies();

Que, também, contém exatamente o que eu seria de esperar que.No entanto, o que eu estou tentando descobrir é como carregar esses conjuntos, de modo que o meu escavação em meus objetos funcionará corretamente.Eu entendo que, se esses conjuntos foram no GAC ou no diretório do executável, eu poderia carregá-los pelo seu nome, mas que provavelmente não é o caso para este caso de uso, e é minha principal caso de uso.

Então, o que ferve para baixo é como faço para carregar um determinado conjunto e de todos os seus arbitrária de conjuntos, começando com um nome de arquivo e resultando em um completamente Reflexão-navegável árvore de tipos, propriedades, métodos, etc.

Eu sei que ferramentas como o Refletor de fazer isso, eu simplesmente não consigo encontrar a sintaxe para ficar com ele.

Foi útil?

Solução

Algumas opções aqui:

  1. Anexar ao AppDomain.AssemblyResolve e fazer outro LoadFile com base no pedido de reunião.
  2. Rotação outro AppDomain com o diretório como sua base e carregar as assembléias em que AppDomain.

Eu recomendo perseguindo a opção 2, desde que, provavelmente, será mais limpo e permitir-lhe descarregar todos os assemblies depois.Além disso, considere a possibilidade de carregar assemblies na reflexão-apenas o contexto, se você só precisa refletir sobre elas (ver Assembly.ReflectionOnlyLoad).

Outras dicas

Eu trabalhei Kent Boogaart's segunda opção.Essencialmente o que eu tinha para:

1.) Implementar o ResolveEventHandler em uma classe separada, herdando a partir de MarshalByRefObject e adicionando a Serializable atributo.

2.) Adicionar a atual ApplicationBase, essencialmente, onde o manipulador de eventos da dll é, para o AppDomain PrivateBinPath.

Você pode encontrar o código de github.

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