Criando um assembly em tempo de execução

12/4/2007 1:00:00 PM By Felipe Pessoto

Vou explicar os passos básicos de como criar um pequeno assembly em tempo de execução, usando Reflection. Usando esses recursos seria possível criar um compilador para IL.

Os assemblies são feitos de: Assembly Metadata, Type Metadata, Code (IL) e Resources

  • O Assembly Metadata define propriedades como Nome e Versão do assembly
  • Type Metadata define todas as descrições de um tipo, como métodos, propriedades, nome de classe, etc
  • Code(IL) é o próprio código
  • Resources são imagens, strings, arquivos, etc

Cada assembly deve conter pelo menos um Modulo. Os módulos são uma espécie de caixa que guarda as informações sobre os Tipos.

Então vamos seguir a seguinte ordem, criamos um assembly, um modulo e um tipo, e já teremos o básico.

 

//namespaces necessarios
using System.Reflection;
using System.Reflection.Emit;

//Criamos um AssemblyName
AssemblyName AsyNome = new AssemblyName("MeuAssembly");
//Então definimos um novo assembly no atual AppDomain, não é possível criar um assembly a partir do próprio construtor
AssemblyBuilder AsyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(AsyNome, AssemblyBuilderAccess.RunAndSave);
//AssemblyBuilderAccess.RunAndSave quer dizer que podemos tanto executar esse assembly, quanto salva-lo

//Criamos o modulo a partir do assembly
ModuleBuilder ModBuilder = AsyBuilder.DefineDynamicModule("MeuModulo", "modulo.dll");
//E um tipo a partir do modulo. Este tipo é publico e serializável, você pode atribuir várias propriedades com o operador |
TypeBuilder TipoBuilder = ModBuilder.DefineType("Meutipo", TypeAttributes.Public | TypeAttributes.Serializable);

//Agora podemos definir os membros do tipo, como construtores, métodos, propriedades, etc
//Vamos criar um campo
FieldBuilder CampoBuilder = TipoBuilder.DefineField("Campo", typeof(int), FieldAttributes.Public);

//Podemos tambem salvar o assembly para uso posterior
AsyBuilder.Save("modulo.dll");​
 

Neste exemplo foi usado somente o FieldBuilder, mas você pode criar qualquer outro membro usando os: ConstructorBuilder para construtor, EnumBuilder para enum, EventBuilder para eventos, etc

Você pode usar esse recurso para criar um software que aceite plug-ins por exemplo.

Silverlight 1.1 Tools Alpha para Visual Studio 2008 disponível

11/27/2007 11:05:00 AM By Felipe Pessoto

Saiu a versão atualizada do Silverlight 1.1 Tools Alpha que funciona com a versão final do VS 2008. Você pode fazer o download aqui.

Esta atualização tem as mesmas funcionalidades da versão anterior para o VS2008 Beta 2, só que agora, funciona na versão final.

O conjunto de funcionalidade incluem suporte básico ao sistema de projeto do Silverlight 1.1, edição de markup XAML e intellisense, suporte à debugging, compatibilidade com projetos Expression Blend, intellisense para VB e C# no code-behind.

O próximo release público do Silverlight irá incluir toneladas de novas funcionalidades , bem como melhorias significativas no suporte ao VS 2008.

Sobre o VS 2008 e o Source do Framework

11/20/2007 5:55:00 PM By Felipe Pessoto

Hoje as 00:00 consegui baixar o VSTS Trial(são 4GB!), e uma das primeiras coisas que testei foi a visualização do código fonte da Biblioteca de Classes do Framework e fiquei decepcionado.
Não sei se fiz algo errado, até porque não achei em nenhum lugar como faço pra visualizar o código, então coloquei um breakpoint no código, cliquei no método com o botão direito e cliquei em Go To Definition.

Um novo arquivo é aberto dentro do VS com com todos os métodos da classe, mas ao ver o conteúdo deles, me deparo com apenas algumas linhas de comentários...
Sim apenas os comentários estão disponíveis! Não sei se é temporário ou se é porque estou usando uma versão Trial.

Se alguem tiver mais informações sobre essa funcionalidade, me manda um email.