Bereitstellen von WPF-Anwendung mit 3rd-Party-DLLs
Habe ich schon sehr frustriert versuchen, implementieren Sie eine C#/WPF-Anwendung, die ich erstellt habe, die einige Referenzen zu 3rd-party-DLLs. Ich habe einen Ordner erstellt in dem Projekt, genannt lib
, wo ich alle diese DLLs. In VS2012 habe ich noch die Referenzen, indem Sie auf den Ordner, und Auswahl alle DLLs. Copy Local
eingestellt ist true
für alle. Alles ist in Ordnung, wenn ich Sie zum erstellen und ausführen, aber wenn ich wählen Sie "veröffentlichen", und erstellen Sie eine OneClick-Installer, die Dinge sind nicht so glatt. Während des veröffentlichen-Assistenten, habe ich es zu installieren, von der Festplatte, und legen Sie es auf nie nach updates suchen. Ich nehme den Ordner, legen Sie es auf ein flash-Laufwerk, stecken Sie es in einem anderen PC, führen Sie das setup, und es löst eine Ausnahme aus. Ich glaube, ich weiß, was passiert ist, aber ich kann nicht herausfinden, wie dieses Paket in der Bereitstellung richtig.
Einer meiner DLLs ist ein C# - wrapper um die DLL für ein C++ - Projekt. Wir werden sagen, Application
erfordert DLL1
und DLL1
erfordert DLL2
. DLL2
können nicht Hinzugefügt werden, die als Referenz in das Projekt, da ist nicht ein .NET
DLL. DLL1
erfordert DLL2
im selben Ordner, um ihn abzuholen. Ich bin mit CefSharp die wraps die Chromium Embedded Framework.
Habe ich habe versucht, indem Sie die erforderlichen Dll-Dateien für CefSharp.dll in der publish/Application Files
- Verzeichnis, aber es hat nicht funktioniert. Ich bemerkte, dass alle DLLs, die es von VS2012 habe eine .deploy
Erweiterung auf Sie, ich ging sogar noch weiter und fügte hinzu, dass eine Verlängerung auf, um zu sehen, wenn es das Scannen für das abholen, aber es hat nicht funktioniert entweder. Dies ist meine erste Zeit der Entwicklung und Bereitstellung für eine Windows-Anwendung, und all die tutorials auf der MSDN-Website oder blog-posts, die ich gelesen habe scheinen nicht zu decken diesem Fall, und ich sehe keine anderen Optionen in der Bereitstellungs-manager behandeln diese Arten von Fällen.
Wenn es hilft, die Ausnahme-Code, der geworfen wird: CLR20r3
Wenn ich fangen und Anzeige Ausnahme, die alle die info, die ich bin, sofern der im Grunde sagt CefSharp.dll or one of it's dependencies cannot be loaded
. Die, die ich bekommen habe, bevor, wenn DLL2
wurde nicht im selben Ordner wie DLL1
.
Kann mir jemand helfen, wie die Bereitstellung von VS2012 mit einer situation wie dieser?
Vielen Dank im Voraus!
Edit: Info-Update
War ich versucht, um ein debug-build-version auf einem test-Rechner ohne Visual Studio installiert. Wenn Gebäude für CefSharp
oder jede andere C++ - Laufzeit - DLL
wird es Aussehen, für alle die Debug-Versionen der DLL
die in der Regel den gleichen Namen, aber mit dem Buchstaben 'd' am Ende Hinzugefügt. Wie unten erwähnt, die Debug-version der C++ Runtime ist nicht verteilbar. Nicht, dass Sie können nicht manuell hinzufügen diese DLLs
zu Ihrem Projekt und setzen Sie Sie als Copy Always
, aber das ist eine Art hack-job. Ich startete ein neues Projekt von Grund auf, für alle Release-Versionen der DLLs, gebaut, und alles war in Ordnung.
- habe meine Antwort helfen?
- Hatte noch keine Zeit, check it out yet. Es wird ein paar Stunden, bis ich wieder zu diesem Projekt. Ich werde aktualisieren, mit info, was ich herausfinde. Danke, btw.
- Kein problem, viel Glück - ich weiß wie schmerzhaft so etwas sein kann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe schon reißen meine Haare aus versuchen zu lösen dieses problem heute morgen und fand schließlich die Lösung. Es scheint, dass Sie bereits wissen, welche DLLs etc. Sie benötigen für CEFSharp zu arbeiten, aber ich dachte ich würde führen Sie durch diese im Fall jemand das gleiche problem. Ich habe eine C# WPF Anwendung, und ich bin mit CEFSharp als der web-Ansicht. Ich bin mit CEFSharp v1, da muss ich die JavaScript -> C# Brücke, die Sie bieten, die noch nicht realisiert in v3. Hier sind die groben Schritte, die ich ging durch in der Einrichtung das Projekt (ich verwende VS2013 aber das wird wahrscheinlich funktionieren in VS2012).
Installieren CefSharp
$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef
Konfigurieren Von Build -
Um die CefSharp DLLs kopieren Sie unsere build-Ordner mit der rechten Maustaste auf Ihr Projekt, wählen Sie Eigenschaften -> Build-Ereignisse und geben Sie den folgenden in der "Post-build event command line":
Sollte nun kopieren Sie alle benötigten DLLs aus dem cef-Ordner sowie die
devtools_resources.pak
- Datei und dielocales
Ordner und seinen Inhalt. Ich benötige in meinem Projekt, da muss ich die Chrom-dev-tools.CefSharp
undCefSharp.Wpf
. Das sollte bedacht werden von NuGet.Aufpassen Visual C++ 2012 Runtime-Dateien
Ich nicht wollte, dass die Benutzer herunterladen müssen, die ganzen Visual C++ 2012 Runtime-Dateien, die als Teil der die Bereitstellung so über Visual Studio, fügen Sie den Ordner
Lib\Microsoft.VC110.CRT
und fügen Sie die 3 DLLs (msvcp110.dll
,msvcr110.dll
,vccorlib110.dll
) aus dem folgenden Ordner auf Ihrem Computer zum Ordner, den Sie gerade erstellt haben, in Ihrem Projekt:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT
Wählen Sie die 3 DLL-Dateien in Visual Studio mit der rechten Maustaste -> Eigenschaften. Stellen Sie sicher, Build Action auf "None" und Kopieren Sie die Ausgabe-Verzeichnis ist auf "nicht kopieren". Nun müssen Sie fügen Sie eine weitere post-build-Ereignis, um sicherzustellen, dass diese ordnungsgemäß kopiert (also in das Stammverzeichnis kopiert, so dass Sie sitzen neben den CEF-dlls und Ihr Projekt exe) für debug.
Rechten Maustaste auf Ihr Projekt, wählen Sie Eigenschaften -> Build-Ereignisse und geben Sie den folgenden in der "Post-build event command line" nach dem anderen xcopy-Befehl für CEF:
Zu diesem Zeitpunkt sollte alles Gebäudes. Zum veröffentlichen der app mit ClickOnce, ich brauche es drücken alle die CEF-DLLs sowie die Sicherstellung der Dateien/Ordner erforderlich für Chrom-dev-tools sind vorhanden. Wenn Sie nicht brauchen, die dev-tools oder alle DLLs, dann können Sie optimieren Sie diese entsprechend.
Sicherstellung der CEF-und C++ - Laufzeit-Dateien sind mit ClickOnce bereitgestellte
Vor dem schließen
</Project>
- tag, fügen Sie dieseWird, fügen Sie alles, was aus dem ger Ordner in das Projekt und stellen Sie sicher, dass die C++ - binaries kopiert werden, um die Wurzel des Projektes auf die Bereitstellung. In meinem Fall für CEF, ich bin mit der
\**\*
syntax am Ende des Include-und%(RecursiveDir)
um sicherzustellen, dass alle Dateien kopiert sind, sowie dielocales
Ordner mit seinem Inhalt und Struktur beibehalten. Nachdem<Visible>false</Visible>
Sie sehen nicht die Gegenstände in der Lösung explorer.Entspannen
Nun, wenn Sie veröffentlichen Sie Ihre app, es sollte kopieren alle erforderlichen Dateien und Ordner.
x86
Ordner (und diese Assemblys nicht bekommen standardmäßig geladen, weil Sie nicht in das root-Verzeichnis). Sie können dieses Problem beheben, indem man das Paket Referenz für Cef in eine x86 - (mit oder ohne recursivedir), ein locales (mitlocales\%(Filename)%(Extension)
) und eine root (ohne$(RecursiveDir)
). Zweitens bin ich mit VS2010, so die VC++ - libs endete in SysWOW32. Fand Sie schließlich.Könnten Sie versuchen, diese, die gelöst ein ähnliches Problem bei mir:
Hinzufügen der DLL ' s nicht .NET-Bibliotheken, um die Lösung als Dateien:
Dann legen Sie Ihre build action auf Content und "Copy to output directory" auf "Copy Always".
Diese Weise die Bibliotheken werden in die Ausgabe-Verzeichnis.
Da Sie bereits versucht manuell hinzufügen die verdächtigen dll und es funktioniert noch immer nicht, das nächste, was ich tun würde, ist auszuführen, fusion und sehen, was es wirklich ist, beklagen, in anderen Worten, was genau ist die Abhängigkeit, dass kann nicht geladen werden. Hier ist eine gute Anleitung, wie man die Jagd auf diese Arten von Fehlern:
Back to Basics: Mit Fusion Log Viewer, um Debug-Obskuren Loader Fehler
msvcp110d.dll
was ist die debug-version der C++ Runtime. Noch auf der Suche in immer in das Projekt irgendwie...Vielleicht können Sie arbeiten es aus den https://github.com/Code52/DownmarkerWPF Quellen?
Haben Sie mindestens eine Arbeit ClickOnce-installer für Ihre app einbetten CefSharp. Ich weiß, denn so wurde es auf meinem Rechner installiert!
update sah nur in den Kommentaren, dass es die VC-Redist, dass Sie sagen, Sie fehlen dann Die Verteilung der Visual C++ - Laufzeit-Bibliotheken (MSVCRT) relevant zu sein scheint.
Auch ich scheine zu erinnern, etwas vage zu, dass für "VCRedist Gründe", Sie sollen keine zu verteilen-debug-Versionen Ihrer Anwendung. Können Sie nicht einfach wechseln Sie von einer Debug-auf eine Release-version? Mit diesem ich denke, man kann entweder das bundle benötigt VCRedist-Dateien wie vorgeschlagen in der CefSharp FAQ hinzufügen oder VCRedist als eine Voraussetzung, die in Ihren Installateur. DownmarkerWPF tut es mit Ihrer WIX-installer-setup, die Sie finden können, auf einem ast in Ihren GitHub-repo. Etwas ähnliches ist AFAIK möglich, mit dem VStudio gebündelte installer, wenn das ist, was Sie verwenden.
Dank Barrie ' s Antwort auf diesen, es half mir sehr. Ich bin mit seiner Antwort unten, aber die Aktualisierung für die aktuellen CEF-mithilfe von Visual Studio 2015.
HINWEIS: ich bin nur Gebäude/targeting die x86-Plattform. Sie müssen möglicherweise ändern oder gehören x64 in den copy-Befehle unten, um Ihre Bedürfnisse anzupassen.
Installieren CefSharp
Installieren CefSharp.Wpf über NuGet (ich bin mit der v51.0.0)
NuGet-Bibliothek Nach Der Installation
Dass sollten die relevanten Dateien in
Konfigurieren Von Build -
Aufpassen Visual C++ 2012 Runtime-Dateien
(Geschaltet VCR 2013) ich wollte nicht, dass die Benutzer herunterladen müssen, die ganzen Visual C++ 2013 Runtime-Dateien als Teil der Implementierung, so über Visual Studio, fügen Sie den Ordner " lib\Microsoft.VC120.CRT und fügen Sie die 3 DLLs (msvcp110.dll, msvcr110.dll, vccorlib110.dll) aus dem folgenden Ordner auf Ihrem Computer zum Ordner, den Sie gerade erstellt haben, in Ihrem Projekt:
Zu diesem Zeitpunkt sollte alles Gebäudes. Zum veröffentlichen der app mit ClickOnce, müssen wir es schieben alle CEF-DLLs. Sie optimieren diese entsprechend...
Sicherstellung der CEF-und C++ - Laufzeit-Dateien sind mit ClickOnce bereitgestellte
Vor dem schließenden-tag, fügen Sie den folgenden:
Wird, fügen Sie alles, was aus dem ger Ordner in das Projekt und stellen Sie sicher, dass die C++ - binaries kopiert werden, um die Wurzel des Projektes auf die Bereitstellung. Mit false werden Sie nicht sehen, die Elemente, die im Projektmappen-explorer.
Veröffentlichen
Nun, wenn Sie veröffentlichen Sie Ihre app, sollte es kopieren alle erforderlichen Dateien und Ordner.
(EXTRA INFO) Unterstützung von Älteren Betriebssystemen Infos Unter
Wenn Sie verwenden müssen, CefSharp für ältere Rechner (XP & Vista), einfach
installieren CefSharp.Wpf über NuGet mit der älteren v47.0.0 version und ändern Sie Ihre .NET-targeting an .NET 4.0 Client Profile.
Chrom endete der support für XP und Vista im April 2016, CefSharp version 47 (oder es abouts) hatte noch Unterstützung für Sie.
Noch ein Hinweis auf ein problem und fix für XP:
Es ist ein Chrom Problem für den XP-Bereitstellungen. Unten steht der Artikel beschreibt das Update, gefolgt durch die Schritte zur Bereitstellung von Fehlerbehebung für JBCB.
Hier ist der link zu dem Artikel:
https://bitbucket.org/chromiumembedded/cef/issues/1787
...in ihm werden Sie sehen, ein Verweis auf einen download "dbghelp.dll". Herunterladen und extrahieren.
KÖNNEN SIE EINE POST-INSTALL-ANSATZ WIE UNTEN, ODER WÄHLEN SIE EINSCHLIEßEN, UM DIE DLL ZUSAMMEN MIT IHREN ANDEREN VERÖFFENTLICHTEN DATEIEN. ICH HABE MICH ENTSCHIEDEN NICHT ZUM BEREITSTELLEN DER ZUSÄTZLICHEN DLL UND NUR BEREIT, AUF XP-MASCHINEN (WIR HABEN NUR WENIGE) MANUELL.
Nehmen Sie diese Schritte zum beheben Bereitstellung auf einem XP-Rechner:
HINWEIS: klicken Sie-einmal installiert, werden in einem sub-Ordner in diesem Speicherort:
Lesen Sie sehr sorgfältig die offizielle Liste der CefSharp Abhängigkeiten - es gibt eine Menge von Ihnen! Sie brauchen, um Sie alle in die ClickOnce-bin-Ordner irgendwie.
Hier ist, wie ich es gelöst:
CefSharp
,CefSharp.Core
usw.Files\CefSharp\
).Build Action: Content
, undCopy to Output Dir: Copy always
.Initalise_CefSharpFiles()
kopieren Sie die Dateien/Ordner in den bin-root-Ordner (wo CefSharp sieht für Sie). Zum Beispiel, kopieren von:Bin\Files\CefSharp\*
zu:Bin\*
.Initalise_CefSharpFiles()
nachdem die app geladen, und vor dem initialisieren CefSharp Einstellungen.