c# - cref - ¿Hay una manera fácil de usar InternalsVisibleToAttribute?
remarks c# (3)
Tengo un proyecto de 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 Accessor mágico que pueda tener con los proyectos de prueba de Visual Studio. Quiero usar InternalsVisibleToAttribute
pero cada vez que lo hice, tuve que volver atrás y buscar cómo hacerlo, lo que recuerdo implica crear archivos de claves para firmar los ensamblajes y luego usar sn.exe
para obtener la clave pública y así.
¿Existe alguna utilidad que automatice el proceso de creación de un archivo SNK, configuración de proyectos para firmar los ensamblajes, extracción de la clave pública y aplicación del atributo InternalsVisibleTo ?
¿Hay alguna forma de usar el atributo sin ensamblajes firmados?
Brian tiene razón, pero, por supuesto, en algunos casos sí tiene un conjunto firmado y desea obtener la clave pública de ese conjunto.
Obtener esta clave es sin duda una molestia.
Por lo tanto, he hecho esto:
He personalizado mis herramientas externas en VS.NET, para poder obtener la clave pública del ensamblaje del proyecto actual con solo un clic del mouse.
Así es como se hace:
- En VS.NET, abra el menú ''Herramientas'' y haga clic en ''Herramientas externas''
- Se abrirá una ventana llamada ''Herramientas externas''.
- Haga clic en Agregar
- Para el título, escriba ''Obtener clave pública''
- En ''Comando'', escriba
C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/sn.exe
- En ''Argumentos'', escriba:
-Tp $(TargetPath)
- Asegúrate de marcar la opción ''Usar ventana de salida''
Luego, crea el proyecto y cuando hace clic en ''Obtener clave pública'', debería ver la clave pública de este proyecto en la ventana de resultados.
Hay otra alternativa a la que llamar métodos internos y que está usando "Reflexión".
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo minfo = typeof(BaseClassName).GetMethod("MethodName", bindingFlags);
BaseClassName b = new BaseClassName();
minfo.Invoke(b, null);
Aquí asumo que "BaseClassName" es el nombre de la clase de otra biblioteca de clases y "MethodName" es el nombre del método interno.
No es necesario utilizar conjuntos firmados para utilizar InternalsVisibleTo
. Si no utiliza ensamblajes firmados, solo puede ingresar el nombre completo del ensamblaje.
Entonces, si desea tener acceso a MyAssembly
en su ensamblaje de prueba ( MyAssembly.Test
), todo lo que necesita en AssemblyInfo.cs
para MyAssembly
es el nombre del ensamblaje de prueba como este:
[assembly: InternalsVisibleTo("CompanyName.Project.MyAssembly.Test")]