代码之家  ›  专栏  ›  技术社区  ›  Weeble

使.NET认为特定的网络共享是完全可信的

  •  7
  • Weeble  · 技术社区  · 14 年前

    我只安装了Visual Studio 2010。我正在尝试从命令行生成系统运行单元测试。我所有的开发工作都在使用Samba共享的Linux服务器上的主目录中。当我试图运行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,如下所述: 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
    

    效果不明显。

    其他说明告诉我在“控制面板”的“管理工具”中找到一些Microsoft.NET安全策略工具,但我没有此类工具。(这是因为我只有Visual Studio 2010,而不是更早的版本吗?如果有什么不同的话,我现在运行的是64位Windows7Pro。)

    我真的只想让.NET相信这个目录在我自己的机器上,而不是内部网的一部分。我不希望这些代码在部署时从网络共享运行,只作为开发的一部分。我也不想盲目地信任所有的网络共享,尽管即使这样也比每次运行测试时将所有内容复制到本地驱动器上更容易接受。

    在这个发展阶段,我不想签下所有名字都很强的文件。(我甚至不确定它是否会有帮助,因为在它加载我的程序集之前,NUnit显然已经失败了。)


    编辑-最后我发现我试图解决错误的问题。在研究如何让NUnit在没有子进程的情况下运行.NET 4.0测试时,我发现:

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

    上面写着:

    根据 this page 您还应该在runtime元素下添加这一行[在nunit console.exe.config中]:

    <loadFromRemoteSources enabled="true" />

    这允许以完全信任的方式加载从远程站点(如网站)下载的库。我不知道为什么这是必要的,事实上,我的应用程序调试NUnit没有它就很好。但是,如果你有问题,你可能想试试。

    这帮我解决了我的问题,而不必和卡斯波尔混在一起。

    3 回复  |  直到 7 年前
        1
  •  5
  •   Joe Taylor    9 年前

    这是因为在.NET3.5及以下版本中,位于网络共享上的所有库都被视为部分信任。可以通过使用更高版本的框架运行NUnit来解决这个问题。

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

    这意味着,如果从from命令行运行nunit-console.exe,并且安装了.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
  •  2
  •   Gerald Davis    14 年前

    我对.net 4.0中的安全性了解不够,无法为您提供解决方案,但我可以提供一些有关“缺少”的Microsoft.net安全策略工具的信息。

    它已经在.net 4.0中删除,因此任何引用它的示例都早于.net4.0。即使您安装了.NETFramework2.0以获得“SPT”,它也只会影响.NET2.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

        3
  •  1
  •   Nicole Calinoiu    14 年前

    您确定NUnit是在.NET 4.0下运行的,而不是以前的.NET Framework版本吗?(即使没有安装早期的Visual Studio版本,也可能安装了早期的框架版本。)另外,用于启动NUnit控制台应用程序的完整命令行(包括所有开关值)是什么?