【问题标题】:Visual Studio 2008 .dll files cannot be overwritten, access deniedVisual Studio 2008 .dll 文件无法被覆盖,访问被拒绝
【发布时间】:2010-05-03 20:07:41
【问题描述】:

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

以前有没有人见过这种情况,如果有,我该怎么办?显然,在每次构建之间打开和关闭 Visual Studio 不是一个可接受的解决方案,并且该问题在系统重新启动后仍然存在。

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

【问题讨论】:

  • 你是把其他项目作为项目引用,还是直接从他们的\bin引用他们的DLL?
  • 您是否将您的 bin 目录添加到源代码管理并使其锁定?
  • 该项目不受源代码控制,所以至少没有问题...编辑以解决其他问题
  • 您是否厌倦了清洁溶液。然后建设?
  • 您是否在构建之间进行调试,如果是,是否有 WCF 服务导致后台 WcfSvcHost.exe 运行并持有 DLL 的句柄?

标签: visual-studio-2008 dll


【解决方案1】:

当然。我们遇到了同样的问题。我不能说问题到底是什么时候发生的以及重现问题的条件,但在我们的情况下,它发生在我们有多个模块并且每个模块引用多个其他模块的项目中,并且引用的模块也引用了其他模块等。

这真的很烦人,我们浪费了很多时间试图找出问题所在以及如何解决它,但没有成功。

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

  1. 首先 - 示例项目结构
    - 我的项目(目录)
    - 斌(目录)
    * Proj1.exe
    * Proj2.dll
    * Proj3.dll
    - 源(目录)
    - Proj1(目录)
    - Proj2(目录)
    - bin(目录)
    - Proj3(目录)
    - bin(目录)

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

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

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

  4. Proj3 (.dll) 的构建输出默认设置为 MyProject/Src/Proj3/bin/... postbuild 和 Proj2 一样

  5. 现在参考。假设 Proj1 需要引用 Proj2,Proj2 需要引用 Proj3。

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

上述方法的主要问题:

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

【讨论】:

    【解决方案2】:

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

    您可以从命令提示符或 PowerShell 调用它。

    taskkill -IM devenv.exe /F /T
    

    这两个参数用于/Force 和/T 也会杀死子进程。

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

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多