2012-02-26 6 views
14

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

Вот что моя задача (пропущено) выглядит следующим образом:

<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. Я бы ожидал, что он посмотрит путь, который я ему дал.

журнал 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 

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

+0

Сообщение об ошибке, которое было неправильно закрыто: [MSBuild: путь, используемый для встроенного задания задания, не соблюдается] (https://connect.microsoft.com/VisualStudio/feedback/details/768289/msbuild-path-used-for- рядная задача ссылка-это-не освященный). Повторное представление: [MSBuild: путь, используемый для ссылки на встроенную задачу, не выполняется (занимает 2)] (https://connect.microsoft.com/VisualStudio/feedback/details/2285231) – Stijn

+0

Ошибка была воспроизведена Microsoft, вы может отслеживать его прогресс на странице https://github.com/Microsoft/msbuild/issues/594 – Stijn

ответ

3

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

Вы можете увидеть полный исходный код in my gist.

0

Согласно этой статье в DZone: Web.config transformations вы должны добавить

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

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

0

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

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

Для получения информации об использовании AssemblyResolve уже существует статья о stackoverflow: How to add folder to assembly search path at runtime in .NET?.

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

Смежные вопросы