c# - ¿Cómo usar el atributo "InternalsVisibleTo" con un ensamblaje con nombre seguro?
.net-assembly (3)
Estoy utilizando el atributo "InternalsVisibleTo" con un ensamblaje para exponer los métodos / clases internos a mi proyecto de prueba de unidad.
Ahora necesito instalar ese ensamblaje en el GAC, así que debo darle un nombre seguro. Cuando intento hacerlo, aparece el siguiente error en Visual Studio.
Los ensamblajes firmados de nombre seguro deben especificar una clave pública en sus declaraciones InternalsVisibleTo
Un poco de Google me trajo al siguiente artículo:
https://msdn.microsoft.com/en-us/library/bb763089.aspx
Este artículo dice:
"Determine la clave pública para el conjunto de amigos con nombre seguro".
Este artículo no dice cómo determinar la clave pública. ¿Dónde encuentro la clave pública para el montaje? Además, una vez que tenga la clave pública, ¿sería esta la forma correcta de declarar el atributo?
[assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")]
Para cualquiera que esté usando Visual Studio 2017, existe el último método:
Desde nuestro querido IDE, vaya a " Herramientas> Herramientas externas ... " y " Agregue " una nueva herramienta con esas configuraciones:
- Título: Get PublicKey
- Comando: " C: / Archivos de programa (x86) / Microsoft SDKs / Windows / v10.0A / bin / NETFX 4.6.2 Tools / sn.exe " (/! / Elija la versión de la herramienta de NETFX que coincida con la versión de NETFX de su ensamblaje, aquí es 4.6.2)
- Argumentos: -Tp $ (TargetPath)
- Marque la casilla de verificación "Usar ventana de salida"
Aplicar / OK esos cambios.
En el "Explorador de soluciones", haga clic en el nombre del ensamblado de su proyecto y luego diríjase a " Herramientas> Obtener clave pública ". La ventana de salida debería mostrar la clave pública (bastante larga), junto con la clave de token pública.
Finalmente, en el proyecto que contiene la clase interna (es decir, el proyecto probado) que desea exponer, abra el archivo " AssemblyInfo.cs " y agregue la línea:
[assembly: InternalsVisibleTo ("MyCompany.SolutionName.ProjectName, PublicKey = Pegue su clave pública aquí ")]
/! / Debe eliminar los saltos de línea de su clave pública.
Funcionó perfectamente para mí, ¡así que espero que también sirva para ti!
Para usar InternalsVisibleTo
con un ensamblaje fuertemente firmado, sus ensamblados de "amigos" también deben estar firmados. El token público del ensamblaje de prueba debe especificarse como parte del valor InternalsVisibleTo
.
Tenga en cuenta que el atributo no se usa para la validación real del ensamblaje en el momento de la compilación; solo especifica que las verificaciones en tiempo de ejecución (y las verificaciones en tiempo de compilación para el ensamblaje de un amigo) deben validar esa identidad. Entonces, si solo necesita compilar su ensamblaje principal, puede especificar cualquier token de clave pública (es decir, uno de los ensamblajes de Microsoft que se encuentran en todas las referencias de ensamblaje en su Web.Config, por ejemplo).
En general, dado que firmará ensamblajes, conocerá la clave pública. Es decir, si tiene un archivo snk que sn -t youSnk.snk
mostraría la clave pública. O puede seguir los pasos para obtener el token de ensamblaje de clave pública dentro de Visual Studio para configurar su VS para que muestre el token público para cualquier ensamblado que use sn -Tp {path to assembly}
para obtener una clave pública del ensamblado. (Si el documento se ha ido, los pasos se copian en la otra respuesta a esta pregunta )
Si no prueba la configuración de su versión, esta es una solución fácil:
#if DEBUG
[assembly: InternalsVisibleTo("TestProjNamespace")]
#endif