Visual Studio 2008锁定自定义MSBUILD任务组件

问题描述 投票:0回答:2

My Solution | +- (1) ORM Layer Custom Task Project | | | +- BuildOrmLayerTask.cs // here's my task | +- (2) Business Logic Project // and here's the project that uses it. | +- <UsingTask TaskName="BuildOrmLayerTask" AssemblyFile="$(TaskAssembly)" /> 无论如何,当项目(2)构建时,它都会锁定项目(1)的组件。因此,现在我无法在不关闭解决方案并重新开放的情况下再次构建项目(1)。

我有什么办法可以整理事物,以免自定义构建任务被Visual Studio锁定吗?

edit:

c# visual-studio-2008 msbuild msbuild-task
2个回答
26
投票
ibrahimhashimi

,从字面上看这本书在msbuild上写了这本书,建议appdomainisolatedtask class class,以提供更好的方法) 我自己设法解决了这个问题... 发现了DanMoseley的Forum帖子,这是Microsoft的MSBUILD开发人员之一:

在那里,

不幸的是,这是因为MSBuild加载任务组件 主要应用程序。 CLR不允许组件卸载 从AppDomain中允许对其进行重要的优化 部分 我建议唯一的解决方法是将tomsbuild.exe召集到 构建使用任务的项目。为此,创建 msbuild.exe <>作为vs.

中的外部工具 dan MSBUILD开发人员 Danmoseley -MSFT

因此,似乎要停止锁,您必须产生一个新的msbuild.exe进程。它不可能是在Visual Studio内部运行的,因为当MSBuild运行时,它将任务加载到Visual Studio的主要应用程序域中,并且永远无法卸载。

创建一个新的MSBUILD项目(.csproj或类似项目),该项目覆盖“构建”目标并执行您的自定义操作,例如;

<!-- fragment of Prebuild.csproj --> <Target Name="Build"> <BuildOrmLayerTask Repository="$(Repository)" /> </Target>


如果需要,请将其添加到Visual Studio,但请使用Configuration Manager来确保其在任何配置中都是

构成。只需让VS照顾源控制等,而不是建造。

EDIT取决于

Prebuild.csproj
    的项目的.csproj文件。添加一个使用
  • BeforeBuild

    任务调用msbuild的目标。这将启动一个新的过程,当该过程结束时,文件锁会释放。示例;

    Exec
  • 现在,当您构建依赖项目时,它将在运行编译之前在新过程中执行MSBUILD。

    您可以编辑项目文件并包括以下属性声明
  • <PropertyGroup> <PrebuildProject>$(SolutionDir)Prebuild\Prebuild.csproj</PrebuildProject> </PropertyGroup> <Target Name="BeforeBuild"> <Exec Command="msbuild.exe &quot;$(PrebuildProject)&quot;" /> </Target>

    我知道这是否对您有用。

    
    
    我在针对 @al-Muhandis的评论中提到的是,似乎可以围绕自定义任务创建包装器,以便包装器被锁定,而不是自定义任务DLL。  我对
    任务项目进行了最初的镜头。 它可能是越野车,现在仅与VS2008一起使用。 欢迎拉请求
    项目的想法是基于以下观察结果:为反思目的,从
    <PropertyGroup> <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies> </PropertyGroup>

    (使用,也许是
    MarshalByRefObject
    )派生的任务似乎已加载到主要的应用程序域中,但是创建了一个新的应用程序域来执行任务。 由于加载到主要应用程序域似乎仍然可以锁定DLL,因此使用从加载自定义任务dll的任务创建DLL很有用。 这样,包装器DLL被锁定,但是由于它在自己的应用程序域中执行,因此当包装器任务的执行域被卸载时,自定义任务DLL被卸载。 此过程避免在构建完成后锁定自定义任务DLL。
您应该在使用任务声明中设置task -hostFactory:

AppDomainIsolatedTask

4
投票
关于documentation

说,明确指定了运行任务的过程是短暂的。这允许操作系统执行后立即清理与任务有关的所有资源。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.