Развертывание приложения WPF с помощью сторонних библиотек DLL
я был очень расстроен, пытаясь развернуть приложение c#/WPF, которое я создал, которое имеет некоторые ссылки на сторонние библиотеки DLL. Я создал папку в проекте, под названием lib
, где я разместил все эти библиотеки DLL. В VS2012, я добавил ссылки, перейдя в эту папку, и выбрав все библиотеки. Copy Local
установлено значение true
для всех. Все в порядке, когда я создаю и запускаю, но когда я выбираю опубликовать и создаю установщик OneClick, все не так гладко. Во время мастер публикации, я установил его для установки с диска и установить его никогда не проверять наличие обновлений. Я беру эту папку, помещаю ее на флешку, подключаю к другому компьютеру, запускаю программу установки, и она выдает исключение. Я считаю, что знаю, что происходит, но я не могу понять, как упаковать это, чтобы правильно развернуть его.
одна из моих DLL-это оболочка C# для DLL, предназначенная для проекта c++. Мы скажем:Application
требует DLL1
и DLL1
требует DLL2
. DLL2
не может быть добавлены в качестве ссылки в проекте, потому что это не .NET
DLL. DLL1
требует DLL2
чтобы быть в той же папке, чтобы забрать его. Я использую CefSharp, который обертывает Хром Встроенные Рамки.
я попытался разместить необходимые библиотеки DLL для CefSharp.dll в publish/Application Files
каталог, но это не сработало. Я заметил, что все библиотеки DLL, которые есть у VS2012, имеют
5 ответов
сегодня утром я рвал на себе волосы, пытаясь решить эту проблему, и в конце концов нашел решение. Кажется, вы уже знаете, какие DLL и т. д. вам нужно, чтобы CEFSharp работал, но я думал, что пройду через это, если у кого-то еще есть такая же проблема. У меня есть приложение c# WPF, и я использую CEFSharp в качестве веб-представления. Я использую cefsharp v1, потому что мне нужен мост JavaScript -> C#, который они предоставляют, который еще не реализован в v3. Вот грубые шаги, по которым я шел. через настройку проекта (я использую VS2013, но это, вероятно, будет работать в VS2012).
Установка CefSharp
- Установить CefSharp.В WPF с помощью NuGet (я с помощью v1.25.7)
- это должно поместить соответствующие файлы в
$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef
Настройки Сборки
-
чтобы получить DLL Cefsharp для копирования в наши папки сборки, щелкните правой кнопкой мыши на своем проекте, выберите Свойства - > события сборки и введите следующее в "командной строке события после сборки":
xcopy "$(SolutionDir)packages\CefSharp.В WPF.1.25.7\cef* ""$(TargetDir) " /s /y / i
теперь необходимо скопировать все необходимые библиотеки DLL из папки cef, а также и
locales
папка плюс ее содержимое. Мне они нужны в моем проекте, так как мне нужны инструменты Chromium dev.- дважды проверьте, что ссылки на проект содержат
CefSharp
иCefSharp.Wpf
. Об этом должен был позаботиться Нугет.
забота о файлах среды выполнения Visual C++ 2012
-
я не хотел, чтобы пользователю приходилось загружать все файлы среды выполнения Visual C++ 2012 как часть развертывания, поэтому через Visual Studio добавьте папку
Lib\Microsoft.VC110.CRT
и добавьте 3 DLL (msvcp110.dll
,msvcr110.dll
,vccorlib110.dll
) из папки на компьютере в папку, которую вы только что создали в своем проект:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT
выберите 3 DLL-файла в Visual Studio, щелкните правой кнопкой мыши - > Свойства. Убедитесь, что для действия сборки установлено значение "нет", а для копирования в выходной каталог-значение "не копировать". Теперь вам нужно добавить еще одно событие после сборки, чтобы убедиться, что они скопированы правильно (т. е. скопированы в корень, чтобы они сидели рядом с DLL CEF и вашим проектом exe) для отладки.
-
Правой Кнопкой Мыши проект, выберите Свойства - >События сборки и введите следующее в" командной строке события после сборки " сразу после другой команды xcopy для CEF:
xcopy " $(ProjectDir)Lib\Microsoft.VC110.ЭЛТ*.*" "$(TargetDir) " /s /y / i
в этот момент все должно строиться. Чтобы опубликовать приложение с помощью ClickOnce, мне нужно, чтобы вытолкнуть все библиотеки CEF, а также обеспечить наличие файлов/папок, необходимых для инструментов Chromium dev. Если тебе не нужно ... инструменты dev или все библиотеки DLL, то вы можете настроить это соответственно.
обеспечение CEF и C++ файлы среды выполнения развертываются с ClickOnce
- щелкните правой кнопкой мыши проект в Visual Studio и выберите "выгрузить проект".
- щелкните правой кнопкой мыши и выберите редактировать файл csproj.
-
перед закрывающим тегом
</Project>
тег добавить этот<ItemGroup> <Content Include="$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef\**\*"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <Visible>false</Visible> </Content> </ItemGroup> <ItemGroup> <Content Include="$(ProjectDir)Lib\Microsoft.VC110.CRT\**\*"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <Visible>false</Visible> </Content> </ItemGroup>
это добавит все из папки cef в проект и убедитесь, что двоичные файлы C++ копируются в корень проекта при развертывании. В моем случае для CEF я использую
\**\*
синтаксис в конце Include и%(RecursiveDir)
чтобы убедиться, что все файлы будут скопированы, а такжеlocales
папка с сохраненным содержимым и структурой. Установив<Visible>false</Visible>
вы не увидите элементы в обозревателе решений.
отдыхать
теперь, если вы опубликуете свое приложение, это должны копировать по всем необходимые файлы и папки.
вы можете попробовать это, что решило аналогичную проблему для меня:
добавьте DLL, которые не являются библиотеками .NET в решение в виде файлов:
Right click project > Add > Existing Item
затем установите их действие сборки в Content и "копировать в выходной каталог"в" копировать всегда".
таким образом, библиотеки будут включены в выходной каталог.
поскольку вы уже пытались вручную добавить подозреваемую dll, и она все еще не работает, следующее, что я бы сделал, это запустить fusion и посмотреть, на что он действительно жалуется, другими словами, что именно зависимость, которая не может быть загружена. Вот хороший учебник о том, как выследить эти типы ошибок:
назад к основам: использование Fusion Log Viewer для отладки неясных ошибок загрузчика
может быть, вы можете решить это из https://github.com/Code52/DownmarkerWPF источники?
У них есть хотя бы рабочий установщик ClickOnce для их приложения встраивания CefSharp. Я знаю, потому что он был установлен на моей машине!
обновление просто увидел в комментариях, что это Редист VC, который вы говорите, что вам не хватает тогда распространение библиотек среды выполнения Visual C++ (MSVCRT) представляется актуальным.
также я, кажется, что-то смутно помню о том, что по "причинам VCRedist" вы не должны распространять отладочные версии своего приложения. Вы не можете просто переключиться с отладки на версию выпуска? С этим я думаю, что вы можете либо связать необходимые файлы VCRedist, как предложено в FAQ CEFSHARP или добавить VCRedist в качестве предварительного условия в установщик. DownmarkerWPF делает это с их установкой установщика WIX, которую вы можете найти в ветке в их репозитории GitHub. Нечто подобное возможно ли AFAIK с помощью установщика vstudio, если это то, что вы используете.
благодаря ответу Барри на это, это очень помогло мне. Я использую его ответ ниже, но обновляю его для работы с последним CEF с помощью Visual Studio 2015.
примечание: Я только строю / ориентируюсь на платформу x86. Вам может потребоваться изменить или включить x64 в команды копирования ниже в соответствии с вашими потребностями.
Установка CefSharp
-
Установить CefSharp.Wpf через NuGet (я использую v51.0.0)
-
Это должно поместить соответствующие файлы в
$(SolutionDir)\пакеты CefSharp.В WPF.\51.0.0 CefSharp (CefSharp.В WPF) $(SolutionDir)\пакеты CefSharp.Общий.\51.0.0 CefSharp (CefSharp.Общий) $ (SolutionDir)packages\cef.редист.x86.3.2704.1432\CEF (CEF x86 redist) $ (SolutionDir)packages\cef.редист.х64.3.2704.1432\Сеф (Сеф х64 редист)
Настройки Сборки
- чтобы получить DLL CefSharp для копирования в наши папки сборки... Я не считаю, что это необходимо больше с более поздними версиями CefSharp. Я обнаружил, что мне не нужно ничего из "командной строки события после сборки" xcopy, чтобы получить щелчок один раз, чтобы отправить его. (И да, DevTools тоже работает!)
забота о Visual C++ 2012 Runtime Файлы
-
(переключился на VCR 2013) я не хотел, чтобы пользователю приходилось загружать все файлы среды выполнения Visual C++ 2013 как часть развертывания, поэтому через Visual Studio добавьте папку lib\Microsoft.VC120.CRT и добавьте 3 DLL (msvcp110.библиотеки DLL, msvcr110.dll, vccorlib110.dll файлы) из папки на компьютере в папку только что созданного проекта:
C:\Windows\SysWOW64
(не видел их в C:\Program файлы (x86)\Microsoft Visual Studio 14.0\VC\redist)
на данный момент все должно строиться. Чтобы опубликовать приложение с помощью ClickOnce, нам нужно нажать все библиотеки CEF. Вы можете настроить это соответственно...
обеспечение развертывания файлов среды выполнения CEF и C++ с помощью ClickOnce
- щелкните правой кнопкой мыши проект в Visual Studio и выберите "выгрузить проект".
- щелкните правой кнопкой мыши и выберите для редактирования файла csproj.
-
перед закрывающим тегом добавить следующее:
<!-- BEGIN: CUSTOM ITEM GROUP INCLUDES INTO THE PROJECT (SO CLICK-ONCE PUBLISHES THEM) --> <ItemGroup> <Content Include="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\**\*" Exclude="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\x86\**\*;$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\locales\**\*.pak"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <Visible>false</Visible> </Content> </ItemGroup> <ItemGroup> <Content Include="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\**\en-GB.*;$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\**\en-US.*"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <Visible>false</Visible> </Content> </ItemGroup> <ItemGroup> <Content Include="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\x86\**\*"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <Visible>false</Visible> </Content> </ItemGroup> <ItemGroup> <Content Include="$(SolutionDir)packages\CefSharp.Common.51.0.0\CefSharp\x86\**\CefSharp.BrowserSubprocess.*"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <Visible>false</Visible> </Content> </ItemGroup> <ItemGroup> <Content Include="$(ProjectDir)lib\Microsoft.VC120.CRT\**\*"> <Link>%(Filename)%(Extension)</Link> <Visible>false</Visible> </Content> </ItemGroup> <!-- END: CUSTOM ITEM GROUP INCLUDES INTO THE PROJECT (SO CLICK-ONCE PUBLISHES THEM) -->
это добавит все из папки cef в проект и убедитесь, что двоичные файлы C++ копируются в корень проекта при развертывании. Установив false, вы не увидите элементы в обозревателе решений.
- помните: я только строю / ориентируюсь на платформу x86. Возможно, Вам потребуется изменить или включить x64 в скопируйте команды ниже, чтобы удовлетворить ваши потребности.
публикации
теперь, если вы публикуете приложение, оно должно копировать все необходимые файлы и папки.
(дополнительная информация) поддержка старых операционных систем информация ниже
Если вам нужно использовать CefSharp для старых машин (XP & Vista), просто установите CefSharp.Wpf через NuGet, используя старый v47.0.0 версия и измените таргетинг .NET на .NET Клиентский Профиль 4.0.
Chromium закончил поддержку XP и Vista в апреле 2016 года, cefsharp версии 47 (или там о) все еще поддерживал его.
еще одна заметка о проблеме и исправление для XP:
существует проблема Chromium для развертывания XP. Ниже приведена статья, описывающая исправление, за которым следуют шаги по развертыванию исправления для JBCB.
вот ссылка на статья: https://bitbucket.org/chromiumembedded/cef/issues/1787
...в нем вы увидите ссылку для загрузки "dbghelp.файл DLL." Скачать и извлечь.
ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ПОДХОД ПОСЛЕ УСТАНОВКИ, КАК ПОКАЗАНО НИЖЕ, ИЛИ ВКЛЮЧИТЬ DLL ВМЕСТЕ С ДРУГИМИ ОПУБЛИКОВАННЫМИ ФАЙЛАМИ. Я ВЫБИРАЮ НЕ РАЗВЕРТЫВАТЬ ДОПОЛНИТЕЛЬНУЮ DLL И РАЗВЕРТЫВАТЬ ТОЛЬКО НА МАШИНАХ XP (У НАС ИХ НЕМНОГО) ВРУЧНУЮ.
выполните следующие действия, чтобы исправить развертывание на XP машина:
- установите браузер CefSharp на машине XP (с помощью щелчка один раз)
- копировать "dbghelp.DLL-файл"
- вставьте его в локальный каталог установки на машине XP (согласно инструкциям в предыдущей ссылке:вдоль стороны " libcef.dll " file).
примечание: для click-once устанавливает, будет в подпапке под этим расположением:
C:\Documents and Settings\<UserName>\Local Settings\Apps.0\<auto-gen ostificated ID>