Ответ 1
Мне все же хотелось бы получить реальный ответ на этот вопрос, но я смог решить эту проблему с помощью отражения и просто загрузить сборку.
Вы можете увидеть полный источник в моем стиле.
Я использую новую встроенную задачу 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
Есть ли способ исправить это или я буду вынужден создавать сборку задач вместо этого?
Мне все же хотелось бы получить реальный ответ на этот вопрос, но я смог решить эту проблему с помощью отражения и просто загрузить сборку.
Вы можете увидеть полный источник в моем стиле.
В соответствии с этой статьей в Dzone: преобразования Web.config вы должны добавить
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
только в главном файле MSBuild. Кажется, что MSBuild не находит его и пытается загрузить с GAC
Другая работа вокруг - использование AppDomain.AssemblyResolve. Тем не менее, вам необходимо будет зарегистрировать обработчик, прежде чем инфраструктура потребует сборки.
Это можно сделать, поместив все в делегат Action внутри фрагмента. Другая возможность - установить атрибут "Тип" элемента "Код" в "класс" вместо "фрагмент".
Для получения информации об использовании AssemblyResolve уже существует статья о stackoverflow: Как добавить папку в путь поиска сборки во время выполнения в .NET?.
Все еще не идеальный, но в моем случае более чистый, чем отражение.