2010-10-05 14 views
13

Estoy teniendo un problema similar a lo que Pablo tenía hace un año (ver How to add manifest to a .NET DLL?). Es decir, tengo un proyecto de biblioteca de clase C# en Visual Studio 2008, que genera un dll. El dll hace referencia a algunos ensamblajes privados, por lo que deseo agregar un manifiesto de ensamblaje al archivo DLL que especifica esos otros ensamblados a los que se hace referencia.¿Cómo agregar el manifiesto de ensamblaje a un proyecto de biblioteca de clase C# .NET en Visual Studio 2008?

Sé cómo hacer esto para un ejecutable, es solo appName.exe.manifest, y cuando el archivo se incluye en el proyecto, puede simplemente seleccionarlo como el manifiesto en las propiedades del proyecto.

De acuerdo con la respuesta que le dio a Pablo Ruben (por encima de la pila en el hilo de desbordamiento), un manifiesto sólo se aplica a ex. Sin embargo, la documentación de Microsoft en manifiestos parece sugerir lo contrario (corríjanme si me equivoco), MSDN Assembly Manifests:

un manifiesto de ensamblado es un archivo XML que describe un ensamblaje de lado a lado. Los manifiestos de la asamblea describen los nombres y versiones de los ensamblajes uno al lado del otro, el ensamblaje, así como la dependencia del ensamblaje en otros conjuntos uno al lado del otro . Correcto instalación, activación y ejecución de ensambles uno al lado del otro requiere que el ensamblado manifiesto siempre acompañe un ensamblaje en el sistema .

Debido a la forma de lado a lado búsquedas para conjuntos privados, el siguientes restricciones se aplican nombrar al empaquetar un archivo DLL como un conjunto privado . Una forma recomendada de hacer esto es poner de manifiesto la asamblea en la DLL como un recurso. En este caso , el ID de recurso debe ser igual a 1 y el nombre del ensamblado privado puede ser ser el mismo que el nombre del archivo DLL. Por ejemplo, si el nombre de la DLL es Microsoft.Windows.mysample.dll, el valor del atributo nombre usado en el elemento assemblyIdentity de la manifiesta también puede ser Microsoft.Windows.mysample.

Una forma alternativa es poner de manifiesto la montaje en un archivo separado. En este caso, el nombre del conjunto de y su manifiesto debe ser diferente que el nombre de la DLL. Por ejemplo, Microsoft.Windows.mysampleAsm, Microsoft.Windows.mysampleAsm.manifest, y Microsoft.Windows.Mysample.dll

Así que crearon un assemblyName.manifest manifiesto de ensamblado como un archivo separado, e incluían en el proyecto de biblioteca de clase. Pero cuando voy a las propiedades para el proyecto, obtengo el mismo resultado que Paul, la opción de usar su propio manifiesto está deshabilitada.

¿Estoy haciendo algo mal? ¿Cómo agrego mi manifiesto a la asamblea?

+0

FYI: Todavía se aplica a Visual Studio 2012 –

+0

Y también a VS2015 – DaveInCaz

Respuesta

10

Lo que se citan es absolutamente inapropiado para ensamblados .NET. El caché de lado a lado de Windows es para DLL no administradas, el equivalente exacto en .NET es el GAC. Además, el compilador ya incorpora referencias a los ensamblajes dependientes en el manifiesto de ensamblaje.Puede verlo si ejecuta Ildasm.exe en su ensamblaje. Haga doble clic en el manifiesto, verá las directivas .assembly enumeradas.

Fwiw, la incorporación de su propio manifiesto de Windows en una biblioteca de clases no es un problema. Simplemente use Project + Add New Item y seleccione el ítem de la plantilla del Archivo de Manifiesto de la Aplicación. El contenido generado automáticamente es completamente incorrecto para una DLL, por supuesto, pero sí incrustado en la DLL. Se puede ver que mediante el uso de archivos + + Abrir Archivo y la selección de su montaje. Verá el RT_MANIFEST con la ID del recurso 2. Solo para reiterar: no haga esto para una DLL administrada a menos que quiera ingresar directivas COM sin registro.

+0

Creo que la activación sin registro es lo que necesitaré (MSDN [Cómo: Configurar componentes basados ​​en .NET para la activación sin registro] (http://msdn.microsoft.com/en-us/library/eew13bza(v=VS.90).aspx)). Las instrucciones dadas en la documentación parecen bastante complejas, ¿hay alguna manera más fácil de hacerlo a través de Visual Studio, en lugar de hacerlo a través de herramientas de línea de comandos? –

+0

Decidí ir con una alternativa para mi proyecto, gracias por su ayuda, aunque Hans, ¡lo aprecio! –

+0

FYI: su respuesta todavía se aplica a VS 2012. Un manifiesto agrega al proyecto se incrusta. El uso del contenido EXE por defecto da como resultado errores SXS, pero el uso de contenido de activación de COM sin registro está bien. –

Cuestiones relacionadas