Развертывание приложения 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)

    Библиотека NuGet После Установки

  • Это должно поместить соответствующие файлы в

    $(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 машина:

  1. установите браузер CefSharp на машине XP (с помощью щелчка один раз)
  2. копировать "dbghelp.DLL-файл"
  3. вставьте его в локальный каталог установки на машине XP (согласно инструкциям в предыдущей ссылке:вдоль стороны " libcef.dll " file).

примечание: для click-once устанавливает, будет в подпапке под этим расположением:

C:\Documents and Settings\<UserName>\Local Settings\Apps.0\<auto-gen ostificated ID>