c# - strong - ¿Cómo declarar una asamblea de amigos?
strongly named key (3)
Creo que debes poner el nombre fuerte, que sería algo así como "Company.Product.Test, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 17135d9fcba0119f". Supongo que Company.Product.Tests es el nombre de su ensamblado y 17135d9fcba0119f es la clave pública.
Otra forma de resolver este problema sería no usar ensamblajes separados. Normalmente pongo el código fuente y el código de prueba en el mismo ensamblaje. No sé si tienes alguna preocupación especial de que debes separarlos.
Tengo 2 proyectos en mi solución:
- Asamblea (Biblioteca Básica)
- Asamblea de prueba (NUnit)
Yo había declarado el montaje de prueba como ensamblado de amigos en el primer proyecto:
[assembly: InternalsVisibleTo ("Company.Product.Tests")]
Todo estaba funcionando bien hasta que me di cuenta de que me olvidé de configurar la solución para firmar mis ensamblajes. Así que creé un archivo snk y configuré el proyecto de estudio visual para firmar el primer ensamblaje (Biblioteca básica). Ahora cuando compilo el primer proyecto, obtengo el siguiente error:
La referencia de ensamblado de amigo ''Company.Product.Tests'' no es válida. Los ensamblados firmados de nombre fuerte deben especificar una clave pública en sus declaraciones de InternalsVisibleTo.
Traté de extraer la clave pública de mi archivo snk usando la utilidad sn, pero genera un archivo binario con cable que no estoy seguro de cómo usarlo. ¿Cómo puedo solucionar el problema?
Debe firmar ambos ensamblajes, ya que efectivamente ambos conjuntos se referencian entre sí.
Debe poner la clave pública en el atributo InternalsVisibleTo. Por ejemplo, en Protocolo Buffers utilizo:
[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]
La clave pública se recupera al ejecutar
sn -Tp path/to/test/assembly.dll
Alternativamente, obténgalo del archivo .snk:
sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk
Puede obtener directamente publicKey del ensamblado que le interese, sin magia con sn.exe
<!-- language: c# -->
var assemblyName = Assembly.GetExecutingAssembly().GetName();
Console.WriteLine("{0}, PublicKey={1}",
assemblyName.Name,
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m))));