Как решить:Пользовательская задача MSBuild требует сборки вне AppBase.
-
22-08-2019 - |
Вопрос
У меня есть специальная задача, которую я хочу выполнить при создании проектов 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>
Но нет, это не поддерживается...