4

我有一个自定义 MSBuild 任务(位于程序集 A 中)来构建自定义项目类型(我们称之为“TestAppContent”)。“A”引用当前正在开发的另一个程序集“B”。

为了测试“B”,我使用了一个测试程序 TestApp。TestApp 依赖于使用我们的自定义任务构建的 TestAppContent。

问题是在加载任务后,“B”程序集被 MSBuild 或 VisualStudio 进程锁定,因为包含任务(“A”)的程序集对它有引用。

由于我不能简单地“卸载”程序集并且使用单独的 AppDomain 不起作用,我该如何停止这个锁?

我知道 Microsoft XNA 可以做到这一点,因为您可以为构建过程提供自定义程序集,并且它们会在构建过程之后发布,因此您可以重新构建这些自定义程序集。

4

3 回答 3

2

唯一的方法是使用 AppDomain 并在其上激活 Shadow Copy。我认为您无法在当前 AppDomain 上激活卷影副本,但您可以尝试(请参阅此处的问题)

或者您可以手动将 dll 复制到其他地方并加载它(以编程方式),这样原始 dll 将不会被加载并保持解锁状态。但是你不能两次加载同一个 dll ......所以如果你想卸载和加载一个新版本(或者你重新启动你的程序),你需要一个单独的 AppDomain

编辑:您还可以使用 AppDomain.CurrentDomain.AssemblyResolve 在您的程序尝试加载 dll 时进行拦截。在那里,您可以将其复制到其他地方并加载此副本。

于 2013-04-06T16:57:22.203 回答
2

我认为它对您没有太大帮助,因为您试图自动实现它,但我发现实现此目的的一种手动方法是使用 sysinternals ProcessExplorer使用 dll 终止特定进程。但是杀死似乎并没有伤害VS2013,这使得这是一种无需重新启动MSVS的解决方法。

在这种情况下,我的 Visual Studio 进程实例化了一个 MSBuild 实例,该实例之前创建了 DesignLibrary 程序集 - 现在被锁定,SomeLibrary 项目仅在构建中使用该实例。此时,如果不终止持有锁的 MSBuild 任务,就无法重建 DesignLibrary 程序集。

如果 MSBuild.exe 尝试重建自己创建的文件,或者可能是 Visual Studio 干预这种混乱情况,我希望在构建期间检查 MSBuild.exe。只是另一个想法:也许可以检查进程树并自动终止进程,就像我手动做的那样。一个非常hacky的解决方法;)

于 2014-05-06T19:15:59.323 回答
0

我通常解决这个问题的一种方法是有两种解决方案。第一个构建任务,然后当我按 F5 时,我将其连接到启动devenv.exe以加载第二个 .sln。

第二个解决方案使用第一个构建的任务,导致它被加载到第二个 devenv.exe 进程中。当您停止调试时,第二个 Visual Studio 将关闭,并且带有构建任务的程序集将被释放。

于 2014-06-28T22:05:32.747 回答