问题标签 [shadow-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
960 浏览

asp.net - 在配置中指定卷影复制位置

在我的开发机器上,我有一个慢速系统盘 (SSD) 和一个快速 (RAM Disk) 开发盘。一旦 Visual Studio 启动并运行,开发/构建/测试周期非常快,但应用程序启动要慢得多 [我相信] 因为程序集的影子复制到 CLR 下载缓存所在的系统磁盘。

我已经将 Visual Studio 调试程序集缓存位置指定在 RAM 磁盘上,因此在从 SSD 初始加载后,大多数引用的程序集已经在 RAM 磁盘上。

我知道我可以将自定义代码添加到我的应用程序以影响此更改。但是,由于此配置特定于我的开发环境,因此我不想进行任何代码更改来修改卷影复制行为。这似乎给我留下了 3 个选择:

  • 禁用卷影复制Web.Debug.config
  • 以某种方式指定仅需要的CachePathApplicationName设置AppDomainSetupWeb.Debug.config
  • 以某种方式指定 CLR 的下载缓存路径指向我的 RAM 磁盘

我对 CLR 如何使用 Shadow Copy 的细节不够熟悉,无法知道禁用它是否会以微妙或明显的方式对我的开发和测试周期产生不利影响。(我在我的开发盒上使用 IIS Express,而不是 IIS,以防万一。)所以我想我还有 3 个问题:

禁用卷影复制对代码/构建/运行本地开发周期有什么影响?

是否有配置设置来指定程序集的卷影副本位置?

有没有办法更改全局 CLR 下载缓存位置或Temporary ASP.Net Files目录位置?

(当然还有 4:我还错过了什么吗?:)

0 投票
4 回答
10466 浏览

c# - 在使用 NUnit 进行单元测试时获取所需/正确的组装路径

我刚刚开始尝试最小起订量来对我的模块进行单元测试。

实际上,我必须为其编写单元测试的类使用

Assembly.GetExecutingAssembly().Location内部确定路径。

但是,这在编写单元测试时不起作用,因为执行程序集的路径不同(采用单元测试程序集的路径)

AppData\\Local\\Temp\\3ylnx32t.ukg\\TestApplication.Test\\assembly\\dl3\\aeb938e6\\f3664631_d982ce01.

我试过了,禁用卷影复制。

仍然,它不起作用!

任何建议表示赞赏。提前致谢。

0 投票
1 回答
1304 浏览

appdomain - 程序集无法在影子复制的 AppDomain 中加载

我为 ReSharper 编写了 xunit.net 测试运行程序,并且在 8.0 版本中遇到了问题 - 我看到程序集无法加载到影子复制的 AppDomain 中。相同的代码和测试项目在 7.1 版本中运行良好。不过,我不明白为什么。

运行测试时,ReSharper 会生成一个可执行文件来加载我的插件。我使用 xunit.net 的 API 创建启用了卷影复制的 AppDomain。测试项目程序集被复制到卷影副本缓存中,并开始加载。它将依赖项复制到缓存中,并加载它 - FakeItEasy 的旧版本,它使用 Assembly.LoadFile 加载当前目录中的所有程序集,即测试项目的 bin\Debug 文件夹。因此,FakeItEasy 将这些程序集加载到既不加载上下文中。由于它使用 LoadFile,它绕过了卷影副本缓存,并且文件直接从 bin\Debug 文件夹加载。

之后,测试项目的依赖加载失败,导致 FileNotFoundException。Fusion 绑定日志显示它尝试加载它们,但它们没有被复制到卷影副本缓存中,并且它们无法加载。我不明白为什么。这是绑定失败:

如果我禁用卷影副本缓存,或者使用不使用 LoadFile 的较新版本的 FakeItEasy,则一切正常。但是,我不能责怪 FakeItEasy 的旧版本 - 我让用户在其他项目和程序集上看到相同的错误,所有这些都通过禁用卷影副本缓存来解决。

此外,此方案适用于 ReSharper 7.1 - 相同的插件代码和相同的测试项目。唯一的区别是主机应用程序,但我看不出它有什么不同——例如,没有订阅其他程序集解析事件处理程序。唯一真正的区别是 7.1 主机使用远程处理与 Visual Studio 应用程序对话,而 8.0 使用简单的 TCP 套接字。

有谁知道为什么这在 8.0 版本中失败,但在 7.1 中运行?

编辑(2013 年 7 月 8 日):

我设法通过一个简单的测试使其失败:

使用直接添加到项目中的 Nancy 类的副本(使用引用的ScanModeAssemblyExtensions类)。项目中唯一的其他内容是对 xunit.dll 和 xunit.extensions.dll 的引用。

它不会每次都失败,它令人沮丧地断断续续,但我可以让它FileNotFoundException这个调用中Assembly.ReflectionOnlyLoadFrom抛出一个,同时尝试从 bin\Debug 文件夹加载测试程序集。

这是来自异常的融合日志:

不幸的是,这并没有告诉我——file:// url 是有效的,并且卷影副本缓存包含 xunit.dll 和 WeirdXunitFailures.DLL(测试项目)。此外,调试器中的“模块”窗口显示 WeitdXunitFailures.dll 已从卷影副本缓存位置加载。

再一次,真正奇怪的是 7.1 跑步者工作得很好。

编辑:

事实上,我可以通过调用它来让它失败:

这些是项目 dll 和两个 xunit dll。它仍然很断断续续,但似乎在完全重建后最容易重现,尽管在几次成功运行后仍然会发生(所以不是重建有问题)

0 投票
0 回答
97 浏览

c# - Nunit 卷影复制 dbghelp.dll 问题

为了确保我的 C# 和 MC++ 应用程序使用定义版本的 dbghelp.dll(来自调试工具),我将它放在所有程序集所在的应用程序目录中。这适用于具有较旧版本甚至较新版本的机器。

我有一个 NUnit 测试,它从 dbghelp.dll 调用一些功能。启用卷影复制后,NUnit 使用系统目录中的 dbghelp.dll,而不是程序集文件夹中的那个。这在其 Windows 文件夹中具有旧版本 dbghelp.dll 的系统上无法通过测试,因为某些功能可能在那里不可用。

如果没有卷影副本,它可以在相同的系统上工作,使用程序集目录中的 dbghelp.dll。由于不建议 NUnit 的开发人员关闭卷影复制(有时可能不再可配置),我该怎么办?

0 投票
2 回答
192 浏览

php - stdClass object and Shadow Copy strange output

I have following stdClass object and its assignment using reference object. But once after unsetting unset($A); still $B outputs the previous values of $A even a New value is assigned to $A's ->foo property. See the trace below.

Edit:

Question is that $B was assigned a reference of $A but after unset of $A

  1. How it can print values of Previously assigned value of $A?
  2. If $A is unset and if $B is going to print value of $A then it should print new value of $A?

As we know in case of Shadow Copy if source object is vanished/destroyed then a reference object cannot point to a location where source object was pointing.

0 投票
0 回答
311 浏览

dll - 卸载期间从程序集位置删除缓存

我为它创建了一个 Office 插件和 Windows 安装程序应用程序。根据这篇文章,插件 dll'a 被复制到这样的目录中C:\Users\Robin\AppData\Local\assembly\dl3\VBJZ5WH8.6NJ\HRZA3JXN.LVG\b0520efe\3a5b99ef_2e21cb01\GoldMail Outlook Add-In.DLL。我希望在卸载过程中删除那些复制的文件。某人能否告诉我如何C:\Users\Robin\AppData\Local\assembly\dl3\在我的安装程序应用程序中获取这些复制文件的完整路径(实际上是在卸载中)?它是否保存在注册表或任何其他位置?我注意到,它甚至发生了,文件被复制了多次。任何帮助将不胜感激,问候。

0 投票
1 回答
1196 浏览

c# - 为什么 AppDomain.ShadowCopyFiles 是字符串?

.Net 中有 ShadowCopy 功能,可通过复制程序集来保持文件锁定。有两个属性:

  1. AppDomain.ShadowCopyFiles使用 AppDomainSetup
  2. AppDomainSetup.ShadowCopyFiles将其存储在内部string[]

AppDomainSetupstring Value[]字段,用于存储配置。对我来说奇怪的是它AppDomainSetup.ShadowCopyFiles是一个字符串属性,我们需要设置"true""false"代替真实bool类型。

这是该属性的实现AppDomainSetup

这是 AppDomain.ShadowCopyFiles 的一个实现:

但是为什么在AppDomainSetup这个属性中是一个string?为什么微软没有使用一些bool转换逻辑AppDomain.ShadowCopyFiles

奇怪的是,位于 中的这种有点臭的代码AppDomainSetup,我只是在想我失踪的真正原因是什么?

0 投票
1 回答
124 浏览

c# - 重组不重新加载部分

有点长篇大论……对不起。

我正在使用PartUpdatesInPlace中的示例并更改代码,以便在从 Extensions 路径中删除 Extensions1.dll 后重新加载它。

我在删除 Extensions1.dll 后设置了一个断点,更改Bar使其返回不同的字符串重新编译,然后刷新目录,希望当OnImportsStatisfied运行时,它会返回更新的字符串,但它没有。

按照原版,ShadowCopyAssembly 已启用。

//在Console.WriteLine("按回车键重新添加原条")下设置断点行;Console.ReadLine(); //复制到一个栏中并刷新 File.Copy(BinDir + @"......\PartUpdatesInPlaceExtensions\bin\debug\PartUpdatesInPlaceExtensions.dll", ExtensionsPath + "Extensions1.dll"); directoryCatalog.Refresh();

如果可以使这更简单,我可以将所有代码添加到存储库中。我的“Microsoft.Composition”版本是 1.0.20(从 Nuget 获得)

任何想法为什么会发生这种情况?

据我了解,重组应该发生,因为它已在BarWatcher中启用

0 投票
3 回答
5598 浏览

c# - 使用 AppDomain 进行卷影复制以在运行时覆盖 exe

在以下示例应用程序中,我创建了一个新应用程序AppDomain,并在启用卷影复制的情况下执行它。然后从新的AppDomain我尝试删除(替换)原始的主 exe。但是我收到“访问被拒绝错误”。有趣的是,在启动程序后,可以从 Windows 资源管理器重命名主 exe(但不能删除它)。

卷影复制可以用于运行时覆盖主 exe 吗?

0 投票
1 回答
2060 浏览

c# - 在新的 AppDomain 中启动 WCF 服务以启用卷影复制(Windows 服务托管)

我有一个 WCF 服务库 ( MyWCFService),它用于MEF加载插件并由 Windows 服务托管(所有 .NET 4.0)。我现在正在尝试以新的方式运行它AppDomain并启用它ShadowCopyFiles,希望我可以在运行时更新插件。这是 Windows 服务项目中的代码。

程序.cs

我的服务.cs

有什么办法吗?我做了很多搜索,但仍然不知道如何使它与我当前的设置一起工作(或者我只是无法理解......)

我试图创建一个新的AppDomain内部Main()并用于 domain.DoCallBack(new CrossAppDomainDelegate(() => { ServiceBase.Run(ServicesToRun); }))启动服务,但我无法启动它并继续获取"Error 1053: The service did not respond to the start or control request in a timely fashion".

然后我尝试通过AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = "true";在启动服务MyWCFService.cs之前设置为当前应用程序域启用卷影复制,InitializeComponent();但 dll 仍然被锁定。但是,如果我使用AppDomain.CurrentDomain.SetShadowCopyFiles();(不推荐使用的方法)启用卷影副本,则一切正常。我更困惑。