individual Asamblea Despliegue de Código administrados y no administrados Domingo, 04 de febrero 2007
.NET desarrolladores aman implementación XCOPY. Y aman los componentes de ensamblaje individuales. Al menos, siempre me siento un poco incómodo, si tengo que usar algún componente y necesito recordar una lista de archivos para incluir también con el ensamblaje principal de ese componente. Así que cuando recientemente tuve que desarrollar un componente de código administrado y tuve que aumentarlo con algún código no administrado de una DLL de C (gracias a Marcus Heege por ayudarme con esto), pensé en cómo facilitar el despliegue de las dos DLL . Si esto fuera solo dos ensamblajes, podría haber usado ILmerge para empacarlos en un solo archivo. Pero esto no funciona para los componentes de código mixto con DLL administrados y no administrados.
Así tope aquí tienes lo que se le ocurrió una solución:
que incluyen lo DLL que desea implementar con mis component's conjunto principal como recursos incrustados. Luego configuré un constructor de clase para extraer esos archivos DLL como a continuación. El ctor de clase se llama solo una vez dentro de cada dominio de aplicación, así que es una sobrecarga insignificante, creo.
namespace MyLib
{
public class MyClass
{
static MyClass()
{
ResourceExtractor.ExtractResourceToFile("MyLib.ManagedService.dll", "managedservice.dll");
ResourceExtractor.ExtractResourceToFile("MyLib.UnmanagedService.dll", "unmanagedservice.dll");
}
...
En este ejemplo he incluido dos DLL como recursos, uno de ellos una DLL de código no administrado, y uno de ellos un DLL de código administrado (sólo para fines de demostración), para mostrar, cómo esta técnica funciona para ambos tipos de código .
El código para extraer los archivos DLL en los archivos de su propio es simple:
public static class ResourceExtractor
{
public static void ExtractResourceToFile(string resourceName, string filename)
{
if (!System.IO.File.Exists(filename))
using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
{
byte[] b = new byte[s.Length];
s.Read(b, 0, b.Length);
fs.Write(b, 0, b.Length);
}
}
}
Trabajar con un conjunto de código administrado como este es el mismo de siempre - casi. Usted lo referencia (aquí: ManagedService.dll) en el proyecto principal de su componente (aquí: MyLib), pero establece la propiedad Copy Local en false. Además, se vincula en el conjunto como un elemento existente y establece la acción de compilación en el recurso incrustado.
Para el código no administrado (aquí: UnmanagedService.dll) solo vincula en la DLL como un elemento existente y establece la acción de compilación para el recurso incrustado. Para acceder a sus funciones, use el atributo DllImport como de costumbre, p.
[DllImport("unmanagedservice.dll")] public extern static int Add(int a, int b);
Eso es todo! Tan pronto como cree la primera instancia de la clase con el ctor estático, las DLL incorporadas se extraen en sus propios archivos y están listas para usar como si las hubiera desplegado como archivos separados. Siempre que tenga permisos de escritura para el directorio de ejecución, esto debería funcionar bien para usted. Al menos para el código prototípico, creo que esta forma de implementación de ensamblaje único es bastante conveniente.
¡Disfrútalo!
http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx
Debe utilizar BoxedAppPacker o BoxedApp SDK. Debe ayudar. – MastAvalons
Duplicado de http://stackoverflow.com/questions/666799/embedding-unmanaged-dll-into-a-managed-c-sharp-dll/11038376#11038376 –