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

StackOverflow https://stackoverflow.com/questions/690432

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

gacutil /I <assembly name> 

2-й: Найдите сборку через Кодовые базы или зондирование, в вашей машина.конфигурация файл или в 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-й: скопируйте сборку в тот же каталог раньше и удалите ее после, как сказал Дэвид М.

Вариант — использовать ILMerge чтобы объединить зависимость со сборкой задачи.

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

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

Вы можете определить собственную задачу usingTask:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top