.net MSBuild将输出程序集复制到附加目录 问题

.net MSBuild将输出程序集复制到附加目录 问题,.net,msbuild,.net-reflector,.net,Msbuild,.net Reflector,Visual Studio的Microsoft.VisualStudio.Web.Host.exe在生成期间对%DEVPATH%\*.dll持有读取锁定 背景 我正在用Redgate.NET Reflector在我的开发箱上运行一个网站。NET Reflector要求将环境变量DEVPATH设置为%ALLUSERSPROFILE%\Red Gate\.NET Reflector\DEVPATH\,这样它就可以创建引用程序集的PDB,而无需将它们放在bin目录中。当它创建PDB时,它会将反汇编的.

Visual Studio的Microsoft.VisualStudio.Web.Host.exe在生成期间对
%DEVPATH%\*.dll
持有读取锁定

背景 我正在用Redgate.NET Reflector在我的开发箱上运行一个网站。NET Reflector要求将环境变量
DEVPATH
设置为
%ALLUSERSPROFILE%\Red Gate\.NET Reflector\DEVPATH\
,这样它就可以创建引用程序集的PDB,而无需将它们放在bin目录中。当它创建PDB时,它会将反汇编的.dll复制到
DEVPATH
,并且您运行的任何程序都会引用这些副本,而不是bin目录中的文件

这很好,但在我的例子中,这些反汇编DLL使用反射并在它们所在的同一目录中查找,假设它是原始的bin dir,用于其他程序集——我编写的程序集

以下是我的目录结构:

/inetpub/wwwroot/bin/Arena.Framework.dll          <-- dll to be decompiled
/inetpub/wwwroot/bin/Arena.Custom.Common.dll      <-- my custom dll

/ProgramData/Red Gate/.NET Reflector/DevPath/Arena.Framework.dll    <-- copied by .NET Reflector in order to be decompiled; uses reflection to find types in ./Arena.Custom.*.dll
这将把输出dll复制到
DevPath
。这在我第一次建造时就起作用了,我想我已经完成了。但是,下一次构建时,它失败了,因为Microsoft.VisualStudio.Web.Host.exe(以下简称为Host.exe)已加载它。我假设它可以覆盖
bin
目录中的文件的原因是它实际上没有加载它们,而是将它们复制到临时目录,并在每次构建时加载它们。但是,
DEVPATH
中的文件始终由VS的Host.exe加载。由于.NET Reflector只对您自己没有构建的DLL进行反编译,因此它永远不需要在这些DLL上进行复制,因此也不会遇到我遇到的问题

可能有用的信息。。? 说您可以在csproj属性窗口中禁用托管进程,我这样做了,但它仍在运行。我不确定,但我猜是网站项目导致它运行,而网站的属性窗口没有“调试”选项卡

问题: 除了在构建后将它们复制到
DEVPATH
,还有更好的解决方法吗

也许我应该直接将输出目录从
../bin
更改为
DEVPATH
?这也会将所有依赖项DLL复制到
DEVPATH
,这并不理想

也许有一种方法可以告诉Host.exe在生成过程中卸载文件,或者在生成完成之前终止进程?我尝试手动执行此操作,但MSBuild.exe开始崩溃

我曾考虑过保存
%DEVPATH%
的临时副本,清除该值,以某种方式重新启动Host.exe,构建、复制、设置
%DEVPATH%
,然后再次重新启动Host.exe,但我感觉,如果启用了Host.exe,VS将依赖它在构建期间持续运行

另一个解决方法是关闭VS,删除
DEVPATH
中的文件,重新打开VS,并在每次需要更改DLL时重建。这是一个糟糕的选择,但它是有效的

希望有更好的解决方案

编辑 根据评论,我的问题是:
如何将编译后的DLL的新版本复制到构建时/构建后的
DEVPATH

我读了你的文章两遍,可能是我,但还没有弄清楚你的问题是什么,你想实现什么?你能用一句话把它加在帖子上吗?.我是@stijn的。我昨天读了你的帖子,不知道你在做什么或想做什么。“当它创建PDB时,它会将反汇编的.dll复制到DEVPATH,而您运行的任何程序都会引用这些副本,而不是bin dir中的文件。”这是什么意思?已反汇编(到IL?)的dll本身是不可执行的。@stijn添加了一句话question@RenniePet除了复制到%DEVPATH%之外,我不确定.NET Reflecroe对DLL到底做了什么,以便为它们生成PDB文件。IIS似乎更喜欢%DEVPATH%中的DLL,而不喜欢bin中具有相同名称的DLL。我正在使用的框架(对此没有发言权)使用反射来检测程序集的路径(现在在DEVPATH而不是bin中),然后在同一路径中查找自定义DLL。由于.NET Reflector没有复制我的DLL,因此框架没有看到我的DLL。那么,解决办法就是在编译DLL时将它们复制到DEVPATH。我想,也许是开始了解你在说什么。但你目前的问题到底是什么?关于文件被锁定的事情?为什么这是一个问题,症状是什么?
<Target Name="AfterBuild">
  <Copy SourceFiles="@(MainAssembly)" DestinationFolder="$(DEVPATH)" SkipUnchangedFiles="true" Retries="0" />
  <Message Text="Copied @(MainAssembly) to $(DEVPATH)" />
</Target>