Получите .NET, чтобы считать определенный сетевой ресурс полностью доверенным - PullRequest
7 голосов
/ 12 ноября 2010

У меня установлена ​​(только) Visual Studio 2010. Я пытаюсь запустить свои модульные тесты из системы сборки командной строки. Вся моя работа по разработке находится в моем домашнем каталоге на сервере Linux, который используется совместно с Samba. Когда я пытаюсь запустить NUnit, я получаю сообщение об ошибке:

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)

Я пытался использовать caspol.exe, как описано здесь: Редактировать и запускать проекты .NET из общих сетевых ресурсов

>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

Не имеет очевидного эффекта.

В других инструкциях содержится указание найти инструмент политики безопасности Microsoft .NET в разделе «Администрирование» на панели управления, но такого инструмента у меня нет. (Это потому, что у меня только Visual Studio 2010, а не более ранние версии? Я использую 64-разрядную версию Windows 7 Pro, если это имеет значение.)

Я просто хочу, чтобы .NET поверил, что этот каталог находится на моей собственной машине, а не в интрасети. Я не хочу, чтобы какой-либо из этого кода запускался из сетевого ресурса при развертывании, только как часть разработки. Я также не хочу слепо доверять всем сетевым ресурсам, хотя даже это было бы более приемлемым обходным путем, чем копирование всего на локальный диск каждый раз, когда я хочу запустить тест.

Я бы предпочел не подписывать все под строгими именами на данном этапе разработки. (И я даже не уверен, поможет ли это, поскольку NUnit, по-видимому, завершает работу до того, как загрузит мою сборку.)


РЕДАКТИРОВАТЬ - В конце концов оказалось, что я пытался решить не ту проблему. Пока я выяснял, как заставить NUnit запускать тесты .NET 4.0 без подпроцесса, я обнаружил следующее:

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

Там написано:

Согласно этой странице вы также должны добавить эту строку в элемент времени выполнения [в nunit-console.exe.config]:

<loadFromRemoteSources enabled="true" />

Это позволяет загружать библиотеки с удаленного сайта (например, с веб-сайта) с полным доверием. Я не уверен, почему это было бы необходимо, и действительно, мое приложение прекрасно отлаживало NUnit без него. Однако, если у вас есть проблемы, вы можете попробовать.

Это устранило мою проблему, и мне не пришлось разбираться с caspol.

Ответы [ 3 ]

5 голосов
/ 05 февраля 2014

Это связано с тем, что в .NET 3.5 и ниже все библиотеки, расположенные в общих сетевых ресурсах, рассматриваются как частичное доверие. Это можно обойти, используя более позднюю версию фреймворка для запуска NUnit.

Бегуны NUnit предназначены для платформы v3.5, предположительно для поддержки предыдущих версий. Вы можете проверить это с помощью инструмента corflags, который поставляется с Visual Studio

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

Это означает, что если вы запускаете nunit-console.exe из командной строки from и у вас установлены .NET 3.5 и .NET 4, для запуска исполняемого файла будет использоваться среда исполнения v3.5. Вы можете увидеть это в выводе консоли.

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

Конфигурация содержит элемент <loadFromRemoteSources enabled="true"/>, который заставляет .NET v4 игнорировать частично вызывающую доверие ошибку вызывающей стороны, но этот параметр игнорируется в более старых версиях платформы.

Чтобы принудительно запустить приложение в .NET 4 или более поздней версии, добавьте следующую строку в раздел startup файла конфигурации приложения.

<supportedRuntime version="v4.0"/>

В моем случае мне пришлось добавить шаг в автоматизацию сервера сборки, чтобы изменить эту конфигурацию перед запуском тестов в среде непрерывной интеграции.

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
2 голосов
/ 12 ноября 2010

Я не знаю достаточно информации о безопасности в .net 4.0, чтобы дать вам решение, но я могу дать некоторое представление об «недостающем» инструменте политики безопасности Microsoft .net.

Он был удален в .net 4.0, поэтому любые примеры, ссылающиеся на него, предшествуют .net 4.0.Даже если вы установили .net Framework 2.0 для получения «SPT», это повлияет только на приложения .net 2.0, 3.0 и 3.5.

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

В безопасности произошли значительные изменениямодель в .Net 4.0, поэтому любые документы до 4.0 не следует доверять.

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

1 голос
/ 12 ноября 2010

Вы уверены, что NUnit работает под .NET 4.0 вместо более ранней версии .NET Framework?(Возможно, у вас установлены более ранние версии фреймворка, даже если у вас не установлены более ранние версии Visual Studio.) Кроме того, какую полную командную строку (включая все значения переключателей) вы используете для запуска консольного приложения NUnit?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...