【问题标题】:AppDomain.DynamicDirectory is not generated未生成 AppDomain.DynamicDirectory
【发布时间】:2023-03-26 09:10:02
【问题描述】:

我正在使用下面的代码创建一个 AppDomain

String pa = @"C:\Users\user\AppData\Local\Temp\2\db5fjamk.xnl";
System.IO.Directory.CreateDirectory(pa);
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; //f:\projectpath\out\debug-i386-unittest\UnitTests
setup.ApplicationName = string.Concat(AppDomain.CurrentDomain.FriendlyName, DateTime.UtcNow.Ticks); //UnitTestAdapter: Running test636559691791186101
setup.DynamicBase = pa;
Evidence evidence = AppDomain.CurrentDomain.Evidence;
_Domain = AppDomain.CreateDomain(setup.ApplicationName, evidence, setup);

但是 _Domain.DynamicDirectory 属性不存在。 https://msdn.microsoft.com/en-us/library/system.appdomain.dynamicdirectory(v=vs.110).aspx 明确表示使用了 AppDomainSetup.DynamicBase。

在 vstest.console.exe 中执行更改应用程序域行为的原因可能是什么。有解决办法吗?

【问题讨论】:

  • 您在哪里尝试访问_Domain.DynamicDirectory?我根本没有在你的代码中看到它。
  • 我在下一行使用 _Domain.DynamicDirectory 进行操作。这会引发错误“不支持给定路径的格式。”,检查 _Domain 显示它甚至没有定义属性
  • 您使用的是哪个版本的 .net?
  • .NET Framework 4.6.2
  • 你将不得不慢一点。 “检查_Domain”对您没有帮助,它是一个代理。使用var path = _Domain.DynamicDirectory; 并准确告诉我们您所看到的内容。

标签: c# appdomain vstest.console.exe appdomainsetup


【解决方案1】:

解决方案

检查AppDomain.CurrentDomain.FriendlyName 是否包含冒号 (:) 等非法字符。如果是,您应该使用 SO 问题 How to remove illegal characters from path and filenames? 中讨论的方法之一对 setup.ApplicationName 进行消毒。

背景

当我调试测试时,我得到了一个 System.NotSupportedException 和消息 The given path's format is not supported.

堆栈跟踪是

at System.Security.Permissions.FileIOPermission.EmulateFileIOPermissionChecks(String fullPath)
at System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath)
at System.AppDomain.get_DynamicDirectory()
at System.AppDomain.get_DynamicDirectory()
at SO_AppDomain.Sut.Method() in <path>\Program.cs:line 30
at UnitTestProject1.UnitTest1.TestMethod1() in <path>\UnitTest1.cs:line 14

AppDomain.CurrentDomain.FriendlyName 的值是TestSourceHost: Enumering assembly

快速查看reference source of EmulateFileIOPermissionChecks - 这是堆栈跟踪中出现的最后一个方法 - 发现如果PathInternal.HasInvalidVolumeSeparator 返回true,它会抛出NotSupportedException。该方法包含以下注释:

 // Toss out paths with colons that aren't a valid drive specifier.
 // Cannot start with a colon and can only be of the form "C:" or "\\?\C:".

字符串TestSourceHost: Enumering assembly 明显违反了这条规则。

【讨论】:

  • 成功了。只是对堆栈跟踪有疑问,您最终是如何意识到这是因为友好名称中的非法字符。
  • 我编辑了我的答案,并在查看堆栈跟踪和参考源代码时试图澄清我的思路。
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 2016-12-10
  • 2011-08-10
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多