我想在部分信任环境中测试某段 .NET 代码的行为。最快的设置方法是什么?请随意假设我(和其他读者)完全是 CAS 菜鸟。

@缺口:谢谢回复。遗憾的是,该工具明确适用于非托管代码。我在问题中没有说“托管”,也不应该假设人们会从“.NET”标签中推断出它。

有帮助吗?

解决方案

这是一个很好的问题,特别是从 TDD 的角度以及在不同信任场景下验证代码的角度来看。

我认为我处理这个问题的方式会是这样的——

  • 使用 AppDomain.CreateDomain() 重载在我的 TDD 代码中创建一个 AppDomain,该重载允许您传入 PermissionSet。PermissionSet 将被构造为匹配您想要测试的不同信任场景。

  • 将包含被测逻辑的程序集加载到应用程序域中

  • 在应用程序域中创建类型/调用方法等的实例,捕获安全异常

有点像那样的东西。我还没有时间进行概念验证。

其他提示

您正在寻找的功能内置于 Visual Studio 中:

在项目的安全选项卡上,有一个“高级...”按钮,可让您配置是要在完全信任状态下进行调试,还是在指定的信任级别上进行调试。

使用 微软应用程序验证器.

AppVerifier 有助于确定:

  • 当应用程序正确使用 API 时:(不安全的 TerminateThread API。、正确使用线程本地存储 (TLS) API。、o 正确使用虚拟空间操作(例如,VirtualAlloc、MapViewOfFile)。
  • 应用程序是否使用结构化异常处理来隐藏访问违规。
  • 应用程序是否尝试使用无效句柄。
  • 堆中是否存在内存损坏或问题。
  • 应用程序是否在资源不足的情况下耗尽内存。
  • 临界区的使用是否正确。
  • 在管理环境中运行的应用程序是否能够在权限较低的环境中良好运行。
  • 应用程序以受限用户身份运行时是否存在潜在问题。
  • 线程上下文中未来的函数调用中是否存在未初始化的变量。

您应该查看 .NET Framework 配置工具。它位于 .NET SDK 中,您可以在此处找到有关运行它的说明...http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx

在里面 运行时安全策略 部分您会发现 3 个策略级别:企业、机器和用户。如果您深入研究机器或用户,您会发现以下定义 代码组权限集 。当您说您想要在部分信任环境中测试某些 .NET 代码时,我想您会想要针对已定义的标准权限集之一进行测试,例如 互联网 。你需要定义一个 代码组 与您的应用程序(或特定程序集)匹配,并将您选择的权限集分配给该应用程序 代码组 .

您可以定义自己的自定义 权限集 也是如此,但现在让我们保持简单。

选择您是希望新代码组存在于计算机范围内,还是仅存在于您的用户帐户中,并相应地深入到计算机或用户策略级别。您将看到一个名为 _All _ Code_ 的代码组。通过右键单击并选择,在该组内创建一个子代码组 新的...

给它起个名字,说 部分信任组 ,然后单击 下一个 .

您必须指定该组的成员资格条件,并且有多种类型。我喜欢创建一个名为的特定文件夹 部分信任 在我的计算机上,然后创建匹配的 URL 成员资格条件。所以,我的网址看起来像这样......文件://c:/users/martin/documents/partialtrust/*

* 是一个通配符,用于捕获该路径下的任何程序集。点击 下一个 .

现在您可以为新代码组选择权限集。现在,选择 互联网 。这是一个相当严格的集合,类似于 Java applet 沙箱。点击 下一个结束 .

现在右键单击新代码组并选择属性。在“常规”选项卡中,确保选中最上面的复选框,然后单击“确定”。

现在,从您指定的 URL 下的位置加载的任何 .NET 程序集都将具有 互联网 应用于他们的权限集。如果您没有编写代码来仔细观察减少的权限集,则可能会收到一些 SecurityExceptions。

抱歉,这是一个很长的描述。它确实比听起来简单得多。

我刚刚发表了一篇文章,标题为 使用 xUnit.net 进行部分信任测试 在我的博客上。它详细介绍了我们在实体框架团队中使用的基于 xUnit.net 的框架,以在中等信任度下执行代码。

这是其用法的示例。

public class SomeTests : MarshalByRefObject
{
    [PartialTrustFact]
    public void Partial_trust_test1()
    {
        // Runs in medium trust
    }
}

// Or...

[PartialTrustFixture]
public class MoreTests : MarshalByRefObject
{
    [Fact]
    public void Another_partial_trust_test()
    {
        // Runs in medium trust
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top