2009-03-23 18 views
25

Tengo un proyecto C# y un proyecto de prueba con pruebas unitarias para el proyecto principal. Quiero tener métodos internal comprobables y quiero probarlos sin un objeto mágico de Accessor que pueda tener con los proyectos de prueba de Visual Studio. Quiero usar InternalsVisibleToAttribute pero cada vez que lo he hecho he tenido que volver atrás y buscar cómo hacerlo, lo que recuerdo implica crear archivos clave para firmar los ensamblajes y luego usar sn.exe para obtener la clave pública y así.¿Existe alguna manera fácil de usar InternalsVisibleToAttribute?

  • ¿Hay una utilidad que automatiza el proceso de creación de un archivo de SNK, el establecimiento de proyectos para firmar los ensamblados, extraer la clave pública, y aplicando la InternalsVisibleTo atributo?

  • ¿Hay una manera de utilizar el atributo y sin montajes firmados?

Respuesta

32

Usted no tiene que utilizar ensamblados firmados utilizar InternalsVisibleTo. Si no usa ensamblajes firmados, puede simplemente ingresar el nombre completo del ensamblaje.

Así que si usted quiere tener acceso a MyAssembly en probar el montaje (MyAssembly.Test) todo lo que necesita en AssemblyInfo.cs para MyAssembly es el nombre del conjunto de prueba de la siguiente manera:

[assembly: InternalsVisibleTo("CompanyName.Project.MyAssembly.Test")] 
13

Brian es correcto, pero, por supuesto, en algunos casos tiene un ensamblaje firmado, y desea obtener la clave pública de ese conjunto.

Conseguir esta clave es realmente bastante molesto.
Por lo tanto, he hecho esto:
Personalicé mis herramientas externas en VS.NET, de modo que puedo obtener la clave pública del ensamblado del proyecto actual con solo un clic del mouse.
Esto es cómo se hace:

  • En VS.NET, abra el menú 'Herramientas' y haga clic en 'Herramientas externas'
  • una ventana que se llama 'externos' herramientas se abrirá
  • Haga clic en Añadir
  • Por título, el tipo de 'Obtener clave pública'
  • en 'Comando', el tipo de C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe
  • 'Argumentos' In, escriba: -Tp $(TargetPath)
  • Asegúrese activas la opción 'Use la salida ventana'

A continuación, se genera el proyecto, y al hacer clic en 'clave pública consiguen', debería ver la clave pública para este proyecto en la ventana de salida.

+1

También he usado herramientas como [reflector] (http://www.reflector.net/) y [ilspy] (http://wiki.sharpdevelop.net/ILSpy.ashx) para obtener la misma información que bien –

3

Hay otra alternativa para llamar a métodos internos y que está utilizando "Reflexión".

 BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; 

     MethodInfo minfo = typeof(BaseClassName).GetMethod("MethodName", bindingFlags); 
     BaseClassName b = new BaseClassName();    
     minfo.Invoke(b, null); 

Aquí se supone que "BaseClassName" es el nombre de la clase de otro ClassLibrary y "MethodName" es el nombre del método interno.

Cuestiones relacionadas