2010-11-12 14 views
7

Tengo (solo) Visual Studio 2010 instalado. Estoy intentando ejecutar mis pruebas unitarias desde un sistema de compilación de línea de comandos. Todo mi trabajo de desarrollo está en mi directorio de inicio en un servidor Linux que se comparte con Samba. Cuando trato de ejecutar NUnit Puedo obtener un error como este:Obtenga .NET para considerar un recurso compartido de red específico para ser totalmente confiable

Unhandled Exception: System.TypeInitializationException: The type initializer for 'NUnit.ConsoleRunner.Runner' threw an exception. ---> System.Security.Security 
Exception: That assembly does not allow partially trusted callers. 
    at NUnit.ConsoleRunner.Runner..cctor() 
The action that failed was: 
LinkDemand 
The assembly or AppDomain that failed was: 
nunit-console-runner, Version=2.5.9.10305, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77 
The method that caused the failure was: 
NUnit.Core.Logger GetLogger(System.Type) 
The Zone of the assembly that failed was: 
Intranet 
The Url of the assembly that failed was: 
file:///Z:/gitrepos/smarties/dependencies/Windows-x86/NUnit-2.5.9.10305/bin/net-2.0/lib/nunit-console-runner.DLL 
    --- End of inner exception stack trace --- 
    at NUnit.ConsoleRunner.Runner.Main(String[] args) 
    at NUnit.ConsoleRunner.Class1.Main(String[] args) 

He intentado usar caspol.exe como se describe aquí: Edit and run .NET projects from network shares

>caspol -addgroup 1.2 -url file:///Z:/* FullTrust -name MyZShare 
Microsoft (R) .NET Framework CasPol 4.0.30319.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

WARNING: The .NET Framework does not apply CAS policy by default. Any settings shown or modified by CasPol will only affect applications that opt into using 
CAS policy. 

Please see http://go.microsoft.com/fwlink/?LinkId=131738 for more information. 


The operation you are performing will alter security policy. 
Are you sure you want to perform this operation? (yes/no) 
yes 
Added union code group with "-url" membership condition to the Machine level. 
Success 

No tiene ningún efecto evidente.

Otras instrucciones me dicen que encuentre alguna herramienta de Política de seguridad de Microsoft .NET en Herramientas administrativas en el Panel de control, pero no tengo dicha herramienta disponible. (¿Esto es porque solo tengo Visual Studio 2010, no versiones anteriores? Estoy ejecutando Windows 7 Pro de 64 bits, si hace una diferencia.)

Realmente quiero que .NET crea que este directorio está en mi propia máquina y no parte de la intranet. No quiero que este código se ejecute desde un recurso compartido de red cuando se implementa, solo como parte del desarrollo. Tampoco quiero confiar ciegamente en todos los recursos compartidos de red, aunque incluso eso sería una solución más aceptable que copiar todo en un disco local cada vez que quiero ejecutar una prueba.

Preferiría no tener que firmar todo con nombres fuertes en este punto del desarrollo. (Y ni siquiera estoy seguro de si sería útil, ya que al parecer se NUnit fallando incluso antes de que se haya cargado mi montaje.)


EDITAR - Al final resultó que yo estaba tratando de resolver el problema equivocado . Mientras que encontrar la manera de llegar NUnit para ejecutar .NET 4.0 pruebas sin un subproceso, encontré esto:

http://frater.wordpress.com/2010/05/04/debugging-nunit-tests-under-visual-studio-2010/

Dice:

Según this page También debe agregar esta línea bajo la elemento de tiempo de ejecución [en nunit-console.exe.config]:

<loadFromRemoteSources enabled="true" />

Esto permite que las bibliotecas descargados de un mando a distancia si te (como un sitio web) para ser cargado con plena confianza. No estoy seguro de por qué esto sería necesario y, de hecho, mi aplicación depuró NUnit sin problemas. Sin embargo, si tiene problemas, puede intentarlo.

Esto me solucionó el problema sin tener que perder el tiempo con caspol.

+0

Creo que lo que realmente quiere hacer es habilitar la zona 'Intranet local' en Configuración de Internet-> Seguridad, y agregar la ruta UNC a esa zona. También puede intentar ajustar la configuración de confianza. No estoy 100% seguro de esto, por lo tanto, lo estoy haciendo un comentario en lugar de una respuesta. – CodingGorilla

Respuesta

5

Esto se debe a que en .NET 3.5 y siguientes, todas las bibliotecas ubicadas en recursos compartidos de red se tratan como confianza parcial. Es posible evitar esto utilizando una versión posterior del marco para ejecutar NUnit.

Los corredores NUnit se dirigen al marco v3.5, presumiblemente para soporte heredado. Esto se puede comprobar con la herramienta corflags que viene con Visual Studio

> corflags nunit-console.exe 
Version : v2.0.50727 

Esto significa que si se ejecuta nunit-console.exe de la de línea de comandos y tiene .NET 3.5 y .NET 4 instalado, el v3. 5 tiempo de ejecución se utilizará para ejecutar el ejecutable. Puedes ver esto en la salida de la consola.

> nunit-console.exe 
CLR Version: 2.0.50727.7905 (Net 3.5) 

La configuración contiene el elemento <loadFromRemoteSources enabled="true"/>, que causa v4 .NET para ignorar el error de llamada de confianza parcial, pero se ignora este ajuste en las versiones anteriores del marco.

Para forzar que la aplicación se ejecute en .NET 4 o superior, agregue la siguiente línea a la sección startup del archivo de configuración de la aplicación.

<supportedRuntime version="v4.0"/> 

En mi caso, he tenido que añadir un paso a la automatización de servidor de compilación para realizar este cambio de configuración antes de ejecutar las pruebas en un entorno de integración continua.

desc 'run unit tests' 
task :tests => :compile do 
    runner_dir = FileList["packages/NUnit.Runners*/tools"].first 
    runner_config = File.join(runner_dir, "nunit-console.exe.config") 

    # running the tests from a network share fails due to code access policy if the 
    # runner is on framework v3.5 or lower. force the runner to use v4.0 or above 
    comment = %<!-- Comment out the next line to force use of .NET 4.0 --> 
    runtime_version = %<supportedRuntime version="v4.0.30319"/> 
    File.write(runner_config, File.read(runner_config).sub(comment, runtime_version)) 

    nunit! :actually_run_tests do |nunit| 
    nunit.command = File.join(runner_dir, "nunit-console.exe") 
    nunit.assemblies = FileList["out/**/*.Tests.dll"] 
    nunit.log_level = :verbose 
    end 
end 
+0

Eres totalmente rockero. ¡Después de un par de horas de ver este problema, tu solución lo hizo por mí! ¡¡¡Gracias!!! – Denis

2

No sé lo suficiente sobre seguridad en .NET 4.0 para ofrecerle una solución, pero puedo proporcionarle algunas ideas sobre la herramienta de política de seguridad de Microsoft .NET "faltante".

Se ha eliminado en .NET 4.0, por lo que los ejemplos que se refieren a él son anteriores a .net 4.0. Incluso si instaló .NET Framework 2.0 para obtener el "SPT", esto solo afectaría a las aplicaciones .net 2.0, 3.0 y 3.5.

http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx

Ha habido muchos cambios en el modelo de seguridad en .Net 4.0 por lo tanto todos los documentos anteriores a 4.0 no se debe confiar.

http://msdn.microsoft.com/en-us/library/dd233103.aspx

1

¿Estas seguro que NUnit se ejecuta en .NET 4.0 en lugar de una versión anterior de .NET Framework? (Es posible que tenga instaladas versiones anteriores de Framework incluso si no tiene instaladas versiones anteriores de Visual Studio). Además, ¿cuál es la línea de comando completa (incluidos todos los valores de los switches) que está utilizando para iniciar la aplicación de la consola NUnit?

+0

Creo que NUnit se está ejecutando en .NET 2.0. De hecho, hay muchas versiones diferentes de .NET instaladas con Visual Studio 2010. Pero todavía parece que me faltan las herramientas de configuración para las versiones anteriores. que ejecuta este comando para invocar NUnit: dependencias \ Windows x86 \ NUnit-2.5.9.10305 \ bin \ net-2.0 \ -etiquetas nunit-consola-X86.exe construir \ UpnpWidgetEmulator.Tests.dll Esto se invoca en un directorio en Z :, la unidad de red mapeada. – Weeble

+0

Si se está ejecutando en 2.0, deberá cambiar la política de CAS 2.0 para solucionar el problema. Si desea una IU para la administración de políticas CAS 2.0 x86 CAS, puede descargar el .NET 2.0 x86 SDK desde http://www.microsoft.com/downloads/es/details.aspx?FamilyID=fe6f2099-b7b4-4f47-a244- c96d69c35dec. –

+0

Creo que esta respuesta y el comentario son, de hecho, lo que pedí, así que los marcaré como aceptados, pero en realidad no he probado la herramienta CAS 2.0 ya que al final no la necesité. He editado la pregunta para explicar cómo resolví mi problema. – Weeble

Cuestiones relacionadas