¿Cómo puedo hacer InternalsVisibleTo atributo de trabajo mediante la firma de un público token de clave de seguridad?

Estoy tratando de exponer algunos detalles internos para mi proyecto de prueba unitaria mediante:

[assembly: InternalsVisibleTo("MyTest")]

Pero estoy recibiendo el error:

De Error de 1 Amigo de la asamblea de referencia MyTest’ no es válida. Fuerte-nombre
firmado asambleas debe especificar una clave pública en sus
InternalsVisibleTo declaraciones. …/Miclase.cs…

Cuando me asignar un PublicTokenKey manualmente:

[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]

La solución se construye sin ningún tipo de error.

  1. ¿Por qué tengo que incluir un token de clave pública?
  2. No estoy seguro de si voy a romper algo en la producción, incluyendo el token de clave pública.

Así, ¿cuál es la mejor manera y la más segura para asignar una clave pública para mi proyecto de Prueba?

Usted no debe necesitar para asignar un token de clave pública. Pero usted necesita para asegurarse de que la asamblea los nombres de partido.
Estoy copiar pegar la asamblea los nombres de la Asamblea el Nombre del campo que se muestra en las propiedades del Proyecto. Por lo que debe ser correcto, me pa..
De acuerdo, así que no he encontrado ese problema por mí mismo, pero este chico de aquí podría tener otra opción para usted blog.tylerholmes.com/2008/04/…
La solución se genera sin errores al utilizar PublicKeyToken, pero Intellisense que podría dar una pista de que la asamblea de referencia no se pudo resolver.

OriginalEl autor pencilCake | 2011-08-25

1 Kommentar

  1. 7

    Estoy sorprendido de que PublicKeyToken incluso obras – en mi máquina me obliga a usar PublicKey

    1. La razón por la que usted necesita un token de clave pública es porque fuertemente nombre de las asambleas se puede poner en el GAC, que tiene un alto nivel de confianza. Sería un agujero de seguridad si alguna asamblea llamada ‘MyTest’ (que es potencialmente no son de confianza – por ejemplo, un control en el navegador) podría poner en el interior de un GACed de la asamblea; quiere que la clave pública para evitar este tipo de hack.

    2. Esto no debería romper nada en la producción – incluso si la asamblea no puede ser encontrado. Este atributo se utiliza durante el tiempo de compilación y no en tiempo de ejecución.

    ¿Cuál es la manera más segura?

    Si usted está realmente preocupado por eso de romper el código de producción, quite el atributo durante generaciones de lanzamiento:

    #if (DEBUG || TEST)
    [assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")] 
    #endif

    Si usted tiene un par de proyectos que necesitan el token de clave pública (y tiene un único par de claves, el cual debe) puede también definir un archivo como AssemblyInfo.global.cs y añadir un archivo vinculado para todos sus proyectos:

    class KeyTokens
    {
       public const string Global = ", PublicKeyToken=XxxxxYysakf";
    }

    Esto simplifica las cosas (especialmente si usted necesita para utilizar el PublicKey que es realmente largo):

    #if (DEBUG || TEST)
    [assembly: InternalsVisibleTo("MyTest" + KeyTokens.Global)] 
    [assembly: InternalsVisibleTo("HisTest" + KeyTokens.Global)] 
    [assembly: InternalsVisibleTo("TheirTest" + KeyTokens.Global)] 
    #endif
    Por desgracia, la concatentation enfoque evita que el IntelliSense de trabajo en el «amigo» VS proyecto (connect.microsoft.com/VisualStudio/feedback/details/542121/…, connect.microsoft.com/VisualStudio/feedback/details/108537/…). Hasta que/a menos que esto se corrija, la concatenación de constante enfoque es raro encontrar el favor de la mayoría de los usuarios potenciales.
    es extraño lo que funciona para mí, posiblemente debido a que hacemos referencia a los ensamblados de archivo de salida aquí y no en el proyecto.
    Sólo afecta a las referencias del proyecto. Por desgracia, los escenarios donde amigo asambleas tienden a ser más útiles (semi-privado Api, exponiendo a los internos para las pruebas) son también escenarios en donde las personas tienden a preferir a utilizar en la solución de referencias del proyecto.

    OriginalEl autor Jonathan Dickinson

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea