2008-09-25 5 views

Répondre

8

Votre question n'est pas très précise. Si vous mettez à jour avec plus d'informations, je vais étoffer cette réponse avec des détails supplémentaires.

Voici un aperçu des étapes manuelles impliquées.

  1. Créer un assemblage avec DefineDynamicAssembly
  2. Créer un module avec DefineDynamicModule
  3. créer le type de DefineType. Assurez-vous de passer le TypeAttributes.Interface pour que votre type devienne une interface.
  4. Effectuez une itération sur les membres dans l'interface d'origine et construisez des méthodes similaires dans la nouvelle interface, en appliquant les attributs si nécessaire.
  5. Appelez TypeBuilder.CreateType pour terminer la construction de votre interface.
+0

Nah, c'est cool. Je n'ai pas eu besoin d'utiliser Reflection.Emit auparavant, je voulais juste voir si quelqu'un pouvait repérer une pierre d'achoppement dans mon plan directeur diabolique. –

12

Pour créer dynamiquement un assemblage avec une interface qui a des attributs:

using System.Reflection; 
using System.Reflection.Emit; 

// Need the output the assembly to a specific directory 
string outputdir = "F:\\tmp\\"; 
string fname = "Hello.World.dll"; 

// Define the assembly name 
AssemblyName bAssemblyName = new AssemblyName(); 
bAssemblyName.Name = "Hello.World"; 
bAssemblyName.Version = new system.Version(1,2,3,4); 

// Define the new assembly and module 
AssemblyBuilder bAssembly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(bAssemblyName, AssemblyBuilderAccess.Save, outputdir); 
ModuleBuilder bModule = bAssembly.DefineDynamicModule(fname, true); 

TypeBuilder tInterface = bModule.DefineType("IFoo", TypeAttributes.Interface | TypeAttributes.Public); 

ConstructorInfo con = typeof(FunAttribute).GetConstructor(new Type[] { typeof(string) }); 
CustomAttributeBuilder cab = new CustomAttributeBuilder(con, new object[] { "Hello" }); 
tInterface.SetCustomAttribute(cab); 

Type tInt = tInterface.CreateType(); 

bAssembly.Save(fname); 

Cela crée les éléments suivants:

namespace Hello.World 
{ 
    [Fun("Hello")] 
    public interface IFoo 
    {} 
} 

méthodes Ajout d'utiliser la classe MethodBuilder en appelant TypeBuilder.DefineMethod.

Questions connexes