代码之家  ›  专栏  ›  技术社区  ›  Steve Cooper

Visual Studio 2008锁定自定义MSBuild任务程序集

  •  27
  • Steve Cooper  · 技术社区  · 14 年前

    我正在开发一个自定义的MSBuild任务,它构建一个 ORM layer ,并在项目中使用它。visualstudio的行为阻碍了我的工作,即保留MSBuild任务dll而不放手。

    我想这样组织我的解决方案;

    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)。

    有没有什么方法可以使自定义生成任务不被visualstudio锁定?

    3 回复  |  直到 14 年前
        1
  •  26
  •   Cœur Gustavo Armenta    5 年前

    ( Sayed Ibrahim Hashimi 是谁 wrote the book AppDomainIsolatedTask 更好的方法)

    我自己解决了这个问题。。。

    forum post from Dan Moseley ,Microsoft的MSBuild开发人员之一:

    你好,

    不幸的是,这是因为MSBuild在 主appdomain。CLR不允许卸载程序集 从appdomain,因为这允许对其应用程序进行重要的优化 部分。


    msbuild上的开发人员

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

      <!-- fragment of Prebuild.csproj -->   
      <Target Name="Build">   
           <BuildOrmLayerTask Repository="$(Repository)" />   
      </Target>
      
    • 如果需要,可以将其添加到visualstudio,但请使用配置管理器确保它是 内置任何配置。只是让VS负责源代码控制之类的,而不是构建。

    • 编辑依赖于的项目的.csproj文件 Prebuild.csproj . 添加 BeforeBuild Exec 任务。这将启动一个新进程,当该进程结束时,将释放文件锁。例子;

      <PropertyGroup>   
           <PrebuildProject>$(SolutionDir)Prebuild\Prebuild.csproj</PrebuildProject>   
      </PropertyGroup>   
      <Target Name="BeforeBuild">   
           <Exec Command="msbuild.exe &quot;$(PrebuildProject)&quot;" />   
      </Target>
      

        2
  •  4
  •   Sayed Ibrahim Hashimi    14 年前

    是否可以编辑项目文件并包含以下属性声明

    <PropertyGroup>
        <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
    </PropertyGroup>
    

    如果对你有用,请告诉我。

        3
  •  3
  •   Andrew    10 年前

    isolated-task 项目。它可能有bug,目前只适用于VS2008。拉请求欢迎。

    这个项目的想法是基于观察得出的 MarshalByRefObject (使用,也许, AppDomainIsolatedTask )似乎是为了反射而加载到主应用程序域中,但是创建了一个新的应用程序域来执行任务。由于加载到主应用程序域似乎仍然会锁定DLL,因此使用从中派生的任务创建DLL非常有用 应用域隔离任务 加载自定义任务DLL的。这样,包装器DLL就会被锁定,但是因为它在自己的应用程序域中执行,所以当包装器任务的执行域被卸载时,自定义任务DLL就会被卸载。此过程避免在生成完成后锁定自定义任务DLL。