【问题标题】:MSBuild assembly lockMSBuild 程序集锁
【发布时间】:2013-04-06 07:06:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# visual-studio msbuild xna


    【解决方案1】:

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

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

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

    【讨论】:

    • 我无法重新启动它,因为加载和锁定它的程序是 Visual Studio。我会尝试使用临时目录的卷影副本,但每次我发布构建时它都会复制文件,太浪费磁盘了。
    • 是的,但是卷影复制由 windows 处理,它应该定期删除临时文件
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多