2008-09-25 15 views

risposta

8

La tua domanda non è molto specifica. Se lo aggiorni con più informazioni, affiderò questa risposta con ulteriori dettagli.

Ecco una panoramica dei passaggi manuali coinvolti.

  1. Creare un assieme con DefineDynamicAssembly
  2. Creare un modulo con DefineDynamicModule
  3. Create tipo con DefineType. Assicurati di passare TypeAttributes.Interface per rendere il tuo tipo un'interfaccia.
  4. Iterare sui membri nell'interfaccia originale e creare metodi simili nella nuova interfaccia, applicando gli attributi in base alle esigenze.
  5. Chiama TypeBuilder.CreateType per completare la creazione dell'interfaccia.
+0

Nah, è fantastico. Non avevo bisogno di usare Reflection.Emit prima, quindi volevo solo vedere se qualcuno poteva individuare un ostacolo nel mio piano malvagio. –

12

per creare dinamicamente un assieme con un'interfaccia che ha attributi:

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); 

che crea la seguente:

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

metodi Aggiunta utilizzano la classe MethodBuilder chiamando TypeBuilder.DefineMethod.

Problemi correlati