Visual Studio 2008 .dll文件无法覆盖,访问被拒绝

时间:2010-05-03 20:07:42

标签: visual-studio-2008 dll

这个很奇怪。 Visual Studio 2008似乎没有释放其为我的项目创建的.DLL的句柄,所以我构建的第二次(以及后续时间),当Studio尝试覆盖更改的.dll时,它会获得访问被拒绝错误。在构建一次Visual Studio后,我也无法复制/删除有问题的.dll(Tasks.dll)。 Process Explorer告诉我该文件正在被devenv.exe使用,所以我知道Visual Studio在构建完成后没有放弃它。

以前有人见过这个,如果有的话,我该怎么办呢?显然,在每个构建之间打开和关闭visual studio都不是一个可接受的解决方案,并且问题一直持续到系统重启。

更多背景:我在另一个项目的UsingTask MSBuild指令中使用导致错误的项目的DLL(Tasks.dll),我们称之为Test。设置项目构建顺序,以便在Test之前构建Tasks,然后Test的AfterBuild任务从/bin/debug/Tasks.dll调用任务。

2 个答案:

答案 0 :(得分:2)

不确定。我们遇到了同样的问题。我不知道问题究竟何时发生以及重现它的条件是什么,但在我们的情况下,它发生在我们有多个模块的项目中,每个模块引用了多个其他模块,引用的模块也引用了其他模块等。

这真的很烦人,我们失去了很多时间试图找出问题所在,以及如何解决,但未成功。

我们无法重构项目以简化参考(太昂贵),我们也不能花更多时间来调查问题所以我们找到了解决方法 - 不完美,但它帮助了我们,我们在该项目中使用了多年。这有点复杂,但我会尝试描述它:

  1. 首先 - 示例项目结构
    - MyProject(dir)
    - Bin(dir)
    * Proj1.exe
    * Proj2.dll
    * Proj3.dll
    - Src(dir)
    - Proj1(dir)
    - Proj2(dir)
    - bin(dir)
    - Proj3(dir)
    - bin(dir)

  2. Proj1(我们假设是控制台/ windows应用程序 - * .exe)将输出目录设置为MyProject / Bin

  3. Proj2(.dll)默认将构建输出设置为MyProject / Src / Proj2 / bin / ... 在postbuild事件中,我们将结果复制到“MyProject / Bin”

    复制“$(TargetDir)\ $(TargetName).dll”“$(SolutionDir)Bin”
    复制“$(TargetDir)\ $(TargetName).pdb”“$(SolutionDir)Bin”

  4. Proj3(.dll)默认将构建输出设置为MyProject / Src / Proj3 / bin / ... postbuild与Proj2

  5. 相同
  6. 现在引用。假设Proj1需要引用Proj2,而Proj2需要引用Proj3。

    • 第一次只构建Proj3,这样在postbuild事件命令的结果中它将被复制到MyProject / Bin
    • 现在向Proj2添加对程序集MyProject / Bin / Proj3.dll的引用(浏览到程序集文件,不引用项目)。在项目依赖项中手动设置此项目需要首先构建Proj3。然后构建“Proj2”,以便将其复制到MyProject / Bin(postbuild事件命令)
    • 最后到Proj1添加对程序集MyProject / Bin / Proj2.dll的引用(再次浏览到程序集)。在项目依赖项中手动设置此项目需要Proj2来构建firs。从现在开始,您可以构建完整的解决方案。
  7. 上述方法存在的主要问题:

    • 配置和维护很复杂,尤其是在项目不断增长且经常添加新项目时。
    • 当您将项目签出到新目录并且您正在使用ReSharper之类的工具来分析代码时,它将在首次构建之前报告大量错误。
    • 减少您需要为每个不应在本地复制的引用手动设置的编译时间。
    • 有时会发生某些文件正在使用中,但在我们的环境中,有时可能每周发生一次,有时每月发生一次。

答案 1 :(得分:0)

在这种情况下,您可以做的最简单的事情是使用taskkill命令来终止Visual Studio进程及其所有子进程。

您可以从命令提示符或PowerShell中调用此方法。

taskkill -IM devenv.exe /F /T

两个参数用于/F orce,/T也会杀死子进程。

注意:在命令行中输入taskkill -?以获取更多信息。