Número 53 • noviembre 2008

Visual Basic•C#•ASP.NET•ADO.NET•AJAXSilverlight.NET Framework

dotNetManía

Revista dedicada a los profesionales de la plataforma .NET

Menú

Inicio

Números publicados

Libros

Próximo número (nº54)

Autores

¿Qué es dotNetManía?

Garantía de satisfacción

Contactar

Envíenos su feedback

Pedidos

Suscripciones

Renovaciones

Libros

Publicidad


SP1 de Visual Studio 2008

Patrocinadores

Patrocinador Oro
Microsoft

Patrocinador Plata
Alhambra-Eidos

Patrocinadores Bronce
ABOX
Domitienda
Krasis
Plain Concepts
Raona
Solid Quality Mentors

 

 

 

Nº 11 Enero 2005 Copia, Corta y Pega en Ensamblados .NET Material de apoyo

Por Erick Bacallao, Miguel Katrib y Yoelvis Parodi (Grupo Weboo)
 


Código fuente

class Mathematics

{

      public static bool IsEven(int k)

      {

            return ((k%2)==0);

      }

      public static int Factorial(int k)

      {

            if (k==0) return 1;

            else return k*Factorial(k-1);

      }

      public static float Square(float x)

      {

            return x*x;

      }

}

 

Fuente 1.

 

public static void Clone(Hashtable dicc)

{

  Assembly asmSource =

    Assembly.LoadFrom("...nombre del ensamblado original...");

  AssemblyName asmName =

    new AssemblyName("...nuevo nombre de ensamblado...");

  AssemblyBuilder assemblyBuilder =

    AppDomain.CurrentDomain.DefineDynamicAssembly(asmName,

                               AssemblyBuilderAccess.Save);

  ModuleBuilder moduleBuilder =

    assemblyBuilder.DefineDynamicModule("Utilidades.dll",

                                        "Utilidades.dll");

 

  //Copiar los tipos

  foreach (Type t in asmSource.GetTypes())

  {

    string newTypeName = dicc[t.Name] == null ?

      t.FullName : t.Namespace + "." + (string)dicc[t.Name];

    TypeBuilder typeBuilder =

    moduleBuilder.DefineType(newTypeName, t.Attributes,

                             t.BaseType, t.GetInterfaces());

 

   //Copiar los miembros de cada tipo

   foreach (MemberInfo mInfo in

               t.GetMembers(BindingFlags.DeclaredOnly |

                            BindingFlags.CreateInstance|

                          BindingFlags.Instance|

                            BindingFlags.NonPublic |

                          BindingFlags.Public |

                          BindingFlags.Static))

   {

     //Copiar las variables

     if (mInfo is FieldInfo)

     {

      FieldInfo f = (FieldInfo) mInfo;

      string newFieldName = dicc[f.Name] == null ?

                                f.Name : (string)dicc[f.Name];

      typeBuilder.DefineField(newFieldName,

                              f.FieldType,

                              f.Attributes);

     }

     //Copiar los constructores

     else if (mInfo is ConstructorInfo)

     {

      ConstructorInfo cInfo = (ConstructorInfo) mInfo;

      ConstructorBuilder cBuilder =

         typeBuilder.DefineConstructor(cInfo.Attributes,

                                       cInfo.CallingConvention,

      ParameterType(cInfo.GetParameters()));

      ILGenerator iLGen = cBuilder.GetILGenerator();

      iLGen.Emit(OpCodes.Ldarg_0);

      iLGen.Emit(OpCodes.Call,

                 typeof(object).GetConstructor(new Type[]{}));

      iLGen.Emit(OpCodes.Ret);

     }

     //Copiar los métodos

     else if (mInfo is MethodInfo)

     {

      MethodInfo m = (MethodInfo) mInfo;

      string newMethodName = dicc[m.Name] == null ?

                               m.Name : (string)dicc[m.Name];

      MethodBuilder mBuilder =

         typeBuilder.DefineMethod(

           newMethodName,

           m.Attributes,

           m.CallingConvention,

           m.ReturnType,

           ParameterType(m.GetParameters()));

      MethodBody mBody = m.GetMethodBody();

      byte[] ILByteArray = mBody.GetILAsByteArray();

 

      //Emitir el mismo array de bytes

      mBuilder.CreateMethodBody(ILByteArray,

                                ILByteArray.Length);

      }

      else ...

     }

     typeBuilder.CreateType();

     //Concluye la emisión de un tipo

   }

   moduleBuilder.CreateGlobalFunctions();

  //Concluye la emisión del módulo

   assemblyBuilder.Save("Utilidades.dll");

 }

 

 private static Type[] ParameterType(ParameterInfo[] pInfo)

 {

   Type[] t = new Type[pInfo.Length];

   for (int i = 0; i < pInfo.Length; i++)

     t[i] = pInfo[i].ParameterType;

   return t;

 }

Fuente 2.

Volver
 


dotNetManía es una revista editada por Netalia. Más información.