c# .net

c# - ¿Por qué usar ensamblajes con nombres fuertes?



.net (4)

¿Cuáles son las cosas que no se pueden hacer con un ensamblaje normal?

Dado que todas las discusiones que comenzaron con el surgimiento de Nuget sugirieron deshacerse por completo de las asambleas llamadas con nombre, mi compañía lo intentó y se encontró con un cambio significativo de comportamiento en lo que respecta a la configuración de la aplicación:

Si utiliza la aplicación automática o la configuración de la aplicación de ámbito de usuario proporcionada por VisualStudio (heredando System.Configuration.ApplicationSettingsBase), un fuerte EXE llamado creará exactamente 1 directorio dentro de% LOCALAPPDATA% nombrado, por ejemplo, "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif", sin importar dónde esté el EXE. situado.

Pero sin el nombre seguro, la ubicación (= ruta) del EXE se usará para crear un valor hash que ya difiere entre DEBUG y RELEASE, creando muchos directorios dentro de% LOCALAPPDATA% con el nombre "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf". Esto lo hace inutilizable para las implementaciones de ClickOnce donde el directorio de instalación cambia con cada actualización.

¿Cuáles son las ventajas de usar ensamblajes con nombres fuertes?

¿Cuáles son las cosas que no se pueden hacer con un ensamblaje normal?


Me gustaría agregar que sin un nombre fuerte no puede usar redireccionamientos vinculantes en los archivos de configuración.

Esto no funcionará:

<dependentAssembly> <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly>

Debes tener un token de clave pública

<dependentAssembly> <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly>


Permítanme enumerar los beneficios de nombrar con fuerza su ensamblaje primero:

  1. Un nombre fuerte para su ensamblaje le permite incluir su ensamblaje en el caché de ensamblaje global (GAC). Por lo tanto, te permite compartirlo entre múltiples aplicaciones.

  2. Los nombres fuertes garantizan un nombre único para ese ensamblaje. Por lo tanto, nadie más puede usar el mismo nombre de conjunto.

  3. Un nombre fuerte protege el linaje de versión de un ensamblaje. Un nombre seguro puede garantizar que nadie pueda producir una versión posterior de su ensamblaje. Los usuarios de la aplicación se aseguran de que una versión del ensamblaje que están cargando proviene del mismo editor que creó la versión con la que se creó la aplicación.

  4. Los ensamblajes nombrados fuertes se firman con una firma digital. Esto protege el conjunto de la modificación. Cualquier alteración hace que el proceso de verificación que ocurre en el momento de carga del ensamblaje falle. Se genera una excepción y el ensamblado no se carga.

Más sobre los nombres fuertes de Microsoft se encuentra en Strong-Named Assemblies ( MSDN ).


Solo un ejemplo: me gustaría dar una respuesta haciendo más énfasis en la security . En el caso de que creamos ensamblajes con un código fuente que no queremos que se vuelva a utilizar para un tercero, pero queremos que se pueda probar, podemos firmar firmemente un ensamblaje y hacer que las partes internas sean visibles solo para aquellos ensamblajes con el misma firma.