MSBuild Inline Task - Ссылка на нестандартные сборки Microsoft - PullRequest
15 голосов
/ 26 февраля 2012

Я использую новую встроенную задачу MSBuild для использования TransformXml (XDT Transform) в сборке Microsoft.Web.Publishing.Tasks.dll.

Вот как выглядит моя задача (отрезанная):

<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 загружается, однако при выполнении происходит сбой, потому что он пытается найти сборку в пути к базе приложений, которая: C:\Windows\Microsoft.NET\Framework\v4.0.30319.Я ожидал бы, что он посмотрит на путь, который я ему дал.

Журнал Fusion показывает это:

=== 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

Есть ли способ исправить это, или я буду вынужден создать задачувместо сборки?

Ответы [ 3 ]

3 голосов
/ 26 февраля 2012

Мне бы хотелось получить реальный ответ на этот вопрос, но я смог обойти эту проблему, используя отражение и просто загрузив сборку.

Вы можете увидеть полный источник в моей сущности .

0 голосов
/ 22 ноября 2012

Еще один обходной путь - использование AppDomain.AssemblyResolve. Однако вам нужно будет зарегистрировать ваш обработчик, прежде чем фреймворк будет нуждаться в сборке.

Это можно сделать, поместив все в делегат Action внутри фрагмента. Другая возможность - установить для атрибута «Тип» элемента «Код» значение «класс» вместо «фрагмент».

Для получения информации об использовании AssemblyResolve уже есть статья о стековом потоке: Как добавить папку в путь поиска сборки во время выполнения в .NET? .

Все еще не идеал, но в моем случае чище, чем отражение.

0 голосов
/ 26 июня 2012

Согласно этой статье в Dzone: Преобразования Web.config вы должны добавить

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

только в заголовок файла MSBuild.Кажется, что MSBuild не находит его и пытается загрузить из GAC

...