Мы создаем приложение для Магазина 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)?
Основная причина проблемы, по-видимому, заключается в том, что проекты, которые не удалось загрузить, имели параметр свойства AppContainerApplication в своем файле проекта и не имели параметра свойства WindowsAppContainer.
Я удалил свойство AppContainerSetting, вручную изменив XML-файл проекта. Затем я
Windows Store App Support
на странице общих свойств,Consume Windows Runtime Extension
возможность Yes (/ZW)
на странице C / C ++ All Options иEnable Minimal Rebuild
в No (/Gm-)
также на странице C / C ++ All Options.Непонятно, как проект загружался до добавления пакета NuGet, но обновление настроек, похоже, устранило проблему.
Других решений пока нет …