Как решить: пользовательская задача MSBuild требует сборки вне AppBase

У меня есть пользовательская задача, которую я хочу выполнить при создании своих проектов C#. Эта задача находится в MyTask.dll, которая ссылается на другую сборку, MyCommon.DLL.

Проблема в том, что MyCommon.dll находится в папке "..\Common\MyCommon.dll" относительно MyTask.dll, что ставит ее за пределы каталога AppBase для процесса MSBuild. Я подтвердил, что это действительно проблема, проанализировав журнал MSBuild и просмотрев отчет Fusion об ошибке привязки.

Что я могу сделать, чтобы Fusion нашел MyCommon.dll в процессе сборки? Обратите внимание, что перемещение сборки сломает мое приложение, которое также зависит от него.

ОБНОВЛЕНИЕ: Что ж, похоже, я все-таки воспользуюсь копией. Все другие решения требуют общесистемных модификаций, что в данном случае не является оправданным.


person aoven    schedule 27.03.2009    source источник


Ответы (4)


Так копировать вместо этого? Просто мысль. Имейте там копию только для поддержки сборки, которую вы удалите, когда закончите с ней.

person David M    schedule 27.03.2009
comment
Да, я берегу это, чтобы использовать в качестве самого последнего средства. Это кажется неуклюжим, и я надеюсь, что есть лучший способ. :) - person aoven; 27.03.2009
comment
Согласованный. Но ни о ком я не могу вспомнить с грустью. Посмотрим, что придумают остальные. - person David M; 27.03.2009

Я вижу несколько решений:

1 : добавьте сборку в GAC (у вашей сборки должно быть строгое имя).

gacutil /I <assembly name> 

2 : найдите сборку с помощью Codebases или Probing в файле machine.config. или в msbuild.exe.config .

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="MyCommon"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <codeBase version="2.0.0.0"
                      href="file://C:/yourpath/MyCommon.DLL"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

3-й: скопируйте сборку в тот же каталог до и удалите ее после, как сказал Дэвид М.

person Julien Hoarau    schedule 27.03.2009

Все эти «решения» создают больше зависимостей, которые усложняют среду. Должен быть более простой способ обновить путь зондирования во время выполнения.

В частности, MSBuild должен позволять вам добавлять пути проверки в файл .proj или указывать зависимые библиотеки DLL.

Вы можете определить пользовательскую UsingTask:

<UsingTask TaskName="Task" AssemblyFile="Assembly.dll" />

но вы не можете добавить зависимости? это должно быть включено... здесь с чем-то вроде

<UsingTask TaskName="Task" AssemblyFile="Assembly.dll">
<DependantAssembly AssemblyFile="dependant.dll"/>
</UsingTask>

Но нет, это не поддерживается...

person Community    schedule 20.07.2009

Можно использовать ILMerge, чтобы объединить зависимость в сборка задачи.

person Pieter van Ginkel    schedule 11.09.2012