Cenários de aplicação, pelo nosso código C#, geram dinamicamente um EXE, seus cenários de aplicação podem ser muitos, como autorização de software, você pode inserir as informações de autorização, gerar uma DLL autorizada, etc., então, como alcançar essa função, devemos mencionar um Emit técnico.
1. Visão geral do Emit
Emitir pode ser chamado de emissor ou geração. No Framework, classes relacionadas ao Emit basicamente existem sob o namespace System.Reflection.Emit. Pode-se ver que Emit existe como um elemento de reflexão. Falando em reflexão, todos deveriam estar familiarizados com ela, ela nos permite visualizar os elementos do monte, para obter uma grande quantidade de informações, como quais tipos o conjunto contém, quais métodos o tipo contém, e assim por diante. Mas reflexões só podem ser 'vistas', enquanto o Emit pode gerar código dinamicamente em tempo de execução. Vamos dar uma olhada em como gerar código com o Emit.
2. Módulo de Montagem e Gerenciado
Um assembly é um agrupamento lógico de um ou mais módulos, arquivos de recursos e, em segundo lugar, um assembly é a menor unidade de reutilização, segurança e versionamento. As DLLs e EXEs que vemos podem ser chamadas de assembly, um assembly contém múltiplos módulos, mas geralmente, quando compilamos VS, compilamos apenas um módulo; se quisermos compilar múltiplos módulos em assembly, precisamos usar csc.exe implementação.
3. Gerar dinamicamente operações de código
Primeiro, precisamos entender por qual tipo cada tipo dinâmico é representado no .NET.
Assembly: System.Reflection.Emit.AssemblyBuilder (define e representa assemblies dinâmicos)
Constructor: System.Reflection.Emit.ConstructorBuilder (um construtor que define e representa classes dinâmicas)
Atributo Personalizado: System.Reflection.Emit.CustomAttributeBuilder (ajuda a gerar atributos personalizados usando parâmetros passados pelo construtor para gerar atributos para classes)
Enum: System.Reflection.Emit.EnumBuilder (explica e indica o tipo de enum)
Evento: System.Reflection.Emit.EventBuilder (evento que define a classe)
Campo: System.Reflection.Emit.FieldBuilder (Define e representa campos.) não pode herdar tal classe)
Variáveis locais: System.Reflection.Emit.LocalBuilder (representa variáveis locais dentro de um método ou construtor)
Método: System.Reflection.Emit.MethodBuilder (um método (ou construtor) que define e representa uma classe dinâmica)
Módulo: System.Reflection.Emit.ModuleBuilder (define e representa módulos em conjuntos dinâmicos)
Parâmetro: System.Reflection.Emit.ParameterBuilder (criar ou associar informações de parâmetros como parâmetros de método, parâmetros de evento, etc.)
Propriedade: System.Reflection.Emit.PropertyBuilder (Defina o tipo de propriedade)
Classe: System.Reflection.Emit.TypeBuilder (definir e criar uma nova instância da classe em tempo de execução)
OpCode é uma descrição de uma diretiva de linguagem intermediária (IL). Existem muitas instruções para isso, você pode conferir o site oficial da Microsoft:O login do hiperlink está visível.
Restrições de acesso ao AssemblyBuilderAccess
AssemblyBuilderAccess.Run; Indica que a montagem pode ser executada, mas não salva. AssemblyBuilderAccess.Save; Indica que a montagem pode ser salva, mas não executada. AssemblyBuilderAcesso.RunAndSave; Indica que a montagem pode ser salva e executada. AssemblyBuilderAccess.ReflectionOnly; Indica que assemblies só podem ser usados em um contexto reflexivo e não podem ser executados. AssemblyBuilderAccess.RunAndCollect; Indica que o assembly pode ser descarregado e a memória é recuperada.
O código é o seguinte:
Primeiro, use emit para gerar código IL, depois gere dinamicamente um assembly e, finalmente, carregue o assembly e chame seus métodos, como mostrado na figura abaixo:
Use o ILSpy para visualizar o código gerado conforme mostrado na imagem abaixo:
(Fim)
|