2010-05-03 100 views
3

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

有没有人看过这个之前,如果是的话,我能做些什么呢?很明显,在每个构建之间打开和关闭Visual Studio并不是一个可接受的解决方案,并且问题在整个系统重新启动时仍然存在。

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

+0

您是否将其他项目作为项目引用,或者直接从其\ bin引用它们的DLL? – 2010-05-03 20:19:46

+0

您是否已将bin目录添加到源代码管理并将其锁定? – 2010-05-03 20:26:32

+0

该项目不受源代码管理,因此至少在那里没有问题...编辑以解决其他问题 – Joel 2010-05-03 20:38:02

回答

2

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

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

我们不能重构项目来简化参考(太贵),我们也不能花更多的时间来调查问题,所以我们找到了解决方法 - 不完美,但它对我们有所帮助,并且我们多年来一直使用它项目。这是一个有点复杂,但我会尽力来形容它:

  1. 首先 - 例如项目结构
      - MyProject的(DIR)
          - 宾(DIR)
              * Proj1.exe
              * Proj2.dll
              * Proj3。等
          - Src的(DIR)
                - Proj1(DIR)
                - Proj2(DIR)
                        - 仓(DIR)
                - Proj3(DIR)
                        - 宾(DIR)

  2. Proj1(其中,假设是一个控制台/ Windows应用程序 - *。 exe)的已设置为输出MYPROJECT DIR /滨

  3. Proj2(.DLL)具有建立输出在默认情况下MyProject的/ src目录/ Proj2/bin中设置/ ... 在我们复制结果 “MyProject的/ bin中”

    复制 “$(TARGETDIR)\ $(的TargetName).dll文件”,“$的postbuild事件(SolutionDir)宾 “
    复制” $(TARGETDIR)\ $(的TargetName).PDB “” $(SolutionDir)宾“

  4. Proj3文件(.dll)已建立输出默认设置为MyProject的/ SRC/Proj3 /斌/ ... postbuild就像是Proj2

  5. 现在引用相同,比方说,Proj1需要Proj2和Proj2参考Proj3需要参考。

    • 首次仅Proj3构建,使得在postbuild事件的结果的命令,将被复制到MyProject的/ bin中
    • Proj2现在引用添加到组件MyProject的/ bin中/ Proj3.dll(浏览到装配文件,不引用的项目)。在项目依赖手动设置,这个项目需要先建立Proj3。之后打造“Proj2”,这样它会被复制到MyProject的/ bin中(postbuild事件命令)
    • Proj1
    • 最后添加引用到组装MyProject的/ bin中/ Proj2.dll(再次浏览到组件)。在项目依赖手动设置,这个项目需要Proj2打造冷杉。从现在开始,你可以建立整体解决方案。

主要问题与上面的方法:

  • 复杂的配置和维护,特别是当项目越来越大,新项目往往添加。
  • 时,你会检出项目新鲜目录和您正在使用的工具,如ReSharper的,其分析代码,它会报告错误很多,直到第一个版本。
  • 为了减少编译时间,您需要为每个引用手动设置它不应该在本地复制。
  • 这有时还会发生,有些文件正在使用中,但在我们的环境中,它有时可能每周发生一次,有时一个月发生一次。
0

在这种情况下你可以做的最简单的事情是使用taskkill命令杀死Visual Studio进程及其所有子进程。

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

taskkill -IM devenv.exe /F /T 

的两个参数是/F奥尔塞和/T杀死子进程也是如此。

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