2011-07-31 27 views
5

Me gustaría cargar un archivo dll (Test.dll) como un ensamblado. Puedo hacer esto usando referencias directas de Visual Studio (es decir, cargando el dll como referencia a mi aplicación C#) y cargando el dll usando el método Assembly.LoadFile(filename). Ahora, me gustaría agregar mi archivo dll como un recurso incrustado en mi aplicación Visual Studio y cargar el archivo dll como un ensamblado. Sé cómo cargar este recurso como una matriz de bytes, ¿hay alguna correlación entre la matriz de bytes y el conjunto que podría utilizar? Además, necesito poder llamar a un método ubicado dentro del archivo dll. Vea el código a continuación: explicará más detalladamente lo que estoy haciendo.Cargar un ensamblado desde un recurso incrustado

Assembly SampleAssembly = Assembly.LoadFrom("WindowsFormsApplication2.ThisisaTESTDLL.dll"); 
Type myType = SampleAssembly.GetTypes()[0]; 
MethodInfo Method = myType.GetMethod("myVoid"); 
object myInstance = Activator.CreateInstance(myType,null); 
Method.Invoke(myInstance,new object[] { "param1", "param1"}); 

Si me falta algo aquí, por favor, házmelo saber y editaré la publicación original.

Respuesta

5

Assembly.GetExecutingAssembly(). GetManifestResourceStream (...)

Eso debe conseguir que un objeto Stream. Puede leer una matriz de bytes de eso.

que es posible cargar que el uso de Assembly.Load

+0

Creo que dije en la pregunta, ya puedo leer en una matriz de bytes, ¿hay alguna forma de leer el ensamblado de esta matriz de bytes? –

+0

Sí. Use Assembly.Load (...) –

+0

aquí suena como un ignorante ... Leí la documentación de Assembly.Load y una de las "sobrecargas" dice "byte []". ¿Por qué, entonces, cuando escribo "Assembly.Load" VS dice "cadena" como el parámetro? ¿Hay alguna forma de especificar? –

1

incorporadas, AxInterop.WMPLib.dll y Interop.WMPLib.dll en mi exe y los consiguió cargado usando el siguiente código. El código se coloca justo al comienzo del vacío estático Principal() en el archivo Program.cs. El marco de destino es .NET 3.5 en mi caso. Este código me ayudó a agrupar los dlls en el propio exe sin tener que implementarlos a través de los instaladores. He codificado mis nombres. En el código debajo de "res" está el nombre de mi recurso "res.resx" que contiene los dos dlls incorporados.

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler( 
(s, a) => 
{ 
    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "AxInterop.WMPLib") 
    { 
     return Assembly.Load(res.AxInterop_WMPLib); 
    } 

    if (a.Name.Substring(0, a.Name.IndexOf(",")) == "Interop.WMPLib") 
    { 
     return Assembly.Load(res.Interop_WMPLib); 
    } 

    return null; 
} 

);

Cuestiones relacionadas