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:
,从字面上看这本书在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>
构成。只需让VS照顾源控制等,而不是建造。
如果需要,请将其添加到Visual Studio,但请使用Configuration Manager来确保其在任何配置中都是
EDIT取决于
Prebuild.csproj
BeforeBuild
任务调用msbuild的目标。这将启动一个新的过程,当该过程结束时,文件锁会释放。示例;
Exec
现在,当您构建依赖项目时,它将在运行编译之前在新过程中执行MSBUILD。
您可以编辑项目文件并包括以下属性声明<PropertyGroup>
<PrebuildProject>$(SolutionDir)Prebuild\Prebuild.csproj</PrebuildProject>
</PropertyGroup>
<Target Name="BeforeBuild">
<Exec Command="msbuild.exe "$(PrebuildProject)"" />
</Target>
我知道这是否对您有用。
我在针对 @al-Muhandis的评论中提到的是,似乎可以围绕自定义任务创建包装器,以便包装器被锁定,而不是自定义任务DLL。 我对任务项目进行了最初的镜头。 它可能是越野车,现在仅与VS2008一起使用。 欢迎拉请求
项目的想法是基于以下观察结果:为反思目的,从
<PropertyGroup>
<GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
</PropertyGroup>
(使用,也许是MarshalByRefObject
)派生的任务似乎已加载到主要的应用程序域中,但是创建了一个新的应用程序域来执行任务。 由于加载到主要应用程序域似乎仍然可以锁定DLL,因此使用从加载自定义任务dll的任务创建DLL很有用。 这样,包装器DLL被锁定,但是由于它在自己的应用程序域中执行,因此当包装器任务的执行域被卸载时,自定义任务DLL被卸载。 此过程避免在构建完成后锁定自定义任务DLL。
AppDomainIsolatedTask
说,明确指定了运行任务的过程是短暂的。这允许操作系统执行后立即清理与任务有关的所有资源。