MSBuild内联任务-引用非标准的Microsoft程序集

本文关键字:非标准 Microsoft 程序集 引用 任务 MSBuild | 更新日期: 2023-09-27 18:25:47

我正在使用新的MSBuild内联任务来利用Microsoft.Web.Publishing.Tasks.dll程序集中的TransformXml(XDT转换)。

以下是我的任务(剪切):

<Task>
  <Reference Include="$(MSBuildExtensionsPath)'Microsoft'VisualStudio'v10.0'Web'Microsoft.Web.Publishing.Tasks.dll"/>
  <Reference Include="System.Xml" />
  <Using Namespace="System"/>
  <Using Namespace="System.Linq"/>
  <Using Namespace="System.IO" />
  <Using Namespace="System.Xml"/>
  <Using Namespace="Microsoft.Web.Publishing.Tasks"/>
  <Code Type="Fragment" Language="cs">...</Code>
</Task>

这编译良好,并且加载了DLL,但是,当执行时,它失败了,因为它试图在appbase路径中查找程序集,该路径为:C:'Windows'Microsoft.NET'Framework'v4.0.30319。我本以为它会看到我给它的路径

融合日志显示:

=== Pre-bind state information ==='r
  LOG: User = xxx'Kamran'r
  LOG: DisplayName = Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
   (Fully-specified)'r
  LOG: Appbase = file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/'r
  LOG: Initial PrivatePath = NULL'r
  Calling assembly : (Unknown).'r
  ==='r
  LOG: This bind starts in default load context.'r
  LOG: Using application configuration file: C:'Windows'Microsoft.NET'Framework'v4.0.30319'MSBuild.exe.Config'r
  error MSB4018: LOG: Using host configuration file: 'r
  error MSB4018: LOG: Using machine configuration file from C:'Windows'Microsoft.NET'Framework'v4.0.30319'config'machine.config.'r
  error MSB4018: LOG: Post-policy reference: Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'r
  error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.DLL.'r
  error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.DLL.'r
  error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.EXE.'r
  error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.EXE.'r

有什么方法可以解决这个问题吗?或者我会被迫创建一个任务程序集吗?

MSBuild内联任务-引用非标准的Microsoft程序集

我仍然想要一个真正的答案,但我可以通过反射和加载程序集来解决这个问题。

你可以从我的要点中看到全部的出处。

根据Dzone:Web.config转换中的这篇文章,您必须添加

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)'Microsoft'VisualStudio'v10.0'Web'Microsoft.Web.Publishing.Tasks.dll"/>

就在MSBuild文件的头中。MSBuild似乎找不到它,并试图从GAC 加载

另一个解决方案是使用AppDomain.AssemblyResolve。但是,在框架需要程序集之前,您必须注册处理程序。

这可以通过将Action委托中的所有内容都放在片段中来完成。另一种可能性是将"Code"元素的"Type"属性设置为"class"而不是"fragment"。

有关使用AssemblyResolve的信息,已有一篇关于stackoverflow的文章:如何在.NET中的运行时将文件夹添加到程序集搜索路径?。

仍然不理想,但在我的情况下比反思更干净。