Как избежать дублирования конфликтов DLL с собственными пакетами NuGet?

Мы создаем приложение для Магазина Windows в VS2012, которое зависит от проекта C # (основной пользовательский интерфейс), нескольких проектов C ++ (для поддержки кода) и внешней проприетарной библиотеки. Внешняя библиотека поставляется нам в виде заголовочных файлов DLL +, которые мы поместили в нативную NuGet использование пакета Autopackage.

Три из проектов C ++ делают вызовы во внешнюю библиотеку. Я могу установить пакет внешней библиотеки (из графического интерфейса или командной строки) для каждого из трех проектов, а также могу скомпилировать и собрать все решение без нареканий со стороны Visual Studio. Однако если я выйду из Visual Studio и затем снова открою решение, или если я попытаюсь выгрузить и перезагрузить проекты, включая пакет, Visual Studio отказывается загружать два из проектов, которые импортируют пакет NuGet. Это говорит:

foo.vcxproj : error  : The item "..\..\..\..\abc\packages\Bar.WinRT.redist.1.2.3.4\build\native\bin\Win32\bar.dll" already exists under the filter "".

где Bar.WinRT.redist.1.2.3.4 это внешний библиотечный пакет, содержащий bar.dll, а также foo проект пытается включить пакет. (Имена файлов отредактированы для простоты и конфиденциальности проекта.)

Единственный способ, которым я могу снова загрузить любой из затронутых проектов, — это вручную удалить импорт Bar.WinRT.redist от foo.vcxproj и перезагрузите проект. После перезагрузки проекта я могу переустановить Bar.WinRT.redist либо из командной строки диспетчера пакетов, либо из диалогового окна «Управление пакетами NuGet».

AutoPackage автоматически строит «Bar.WinRT» и «Bar.WinRT.redist» из заголовочных файлов и dll соответственно. Только проект, использованный для сборки окончательного .exe, нуждается в пакете «redist», но он загружается автоматически, потому что AutoPackage заставляет не-redist-пакет (содержащий файлы заголовков) зависеть от redist-пакета.

Каков наилучший способ включить внешний пакет и по-прежнему корректно загружать проекты (и иметь только одну копию DLL, которая попадает в вывод сборки вместе с .exe)?

1

Решение

Основная причина проблемы, по-видимому, заключается в том, что проекты, которые не удалось загрузить, имели параметр свойства AppContainerApplication в своем файле проекта и не имели параметра свойства WindowsAppContainer.

Я удалил свойство AppContainerSetting, вручную изменив XML-файл проекта. Затем я

  1. Включил Windows Store App Support на странице общих свойств,
  2. Установить Consume Windows Runtime Extension возможность Yes (/ZW) на странице C / C ++ All Options и
  3. Установить Enable Minimal Rebuild в No (/Gm-)также на странице C / C ++ All Options.

Непонятно, как проект загружался до добавления пакета NuGet, но обновление настроек, похоже, устранило проблему.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]