2013-07-19 12 views
7

Ich habe ein Windows Phone 8-Projekt und ein anderes Projekt in C++ geschrieben; Beide sind in der gleichen Lösung. Das C++ - Projekt ist eine dynamische Bibliothek, die im WP8-Projekt verwendet wird. Es ist so konfiguriert, dass eine Windows Metada-Datei (.winmd) über der Datei .dll erstellt wird.Hinzufügen einer "winmd" -Referenz vs. Hinzufügen eines Projektverweises

Beim Hinzufügen des C++ - Projekts als Projektreferenz im WP8-Projekt funktioniert alles einwandfrei.

Allerdings würde ich direkt auf die Binärdateien anstelle des Projekts verweisen, so dass ich versucht, die .dll selbst zu referenzieren, aber VS2012 würde mich nicht lassen (was ich völlig verstehe, da die Bibliothek nicht verwaltet wird, was ich verstehe). Hinzufügen der .winmd Datei funktioniert stattdessen, ich meine es kompiliert ohne Warnung/Fehler; aber es stürzt zur Laufzeit ab (ich bekomme eine TargetInvocationException, die ausgelöst wird, weil der "tatsächliche" Code der C++ - Bibliothek nicht gefunden werden kann).

Beim Hinzufügen der .winmd Datei, stellte ich sicher, dass die .dll Datei war daneben. Wenn Sie beide Dateien in das Verzeichnis bin des WP8-Projekts einfügen, funktioniert dies auch nicht.

Ich kann keine Hinweise im Internet finden und ich wäre dankbar, wenn Sie mir etwas geben könnten, irgendwelche Hinweise sind willkommen!

hier ein Schema des Trivialen Architektur Ich versuche einzurichten:

architecture

Und hier ist die Stacktrace der erhöhten Ausnahme:

at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD) 
    at Sqlite.Sqlite3.sqlite3_open_v2(String filename, Database& db, Int32 flags, String zVfs) 
    at SQLite.SQLite3.Open(String filename, Database& db, Int32 flags, IntPtr zVfs) 
    at SQLite.SQLiteConnection..ctor(String databasePath, SQLiteOpenFlags openFlags, Boolean storeDateTimeAsTicks) 
    at SQLite.SQLiteConnection..ctor(String databasePath, Boolean storeDateTimeAsTicks) 
    at WP8ClassLibrary.SomeManager..ctor(String databasePath) 
    at WP8App.SomeViewModel..ctor() 
    at WP8App.MainPage..ctor() 

Antwort

0

Nun, ich habe es geschafft, es zum Laufen zu bringen. Wie der Stacktrace im ursprünglichen Post vermuten lässt, verwende ich SQLite in meiner Anwendung. Wenn ich die winmd-Datei als eine Referenz anstelle des C++ - Projekts hinzufüge, scheint es, dass einige Abhängigkeiten nicht erfüllt sind.

Daher musste ich einen Verweis auf SQLite for Windows Phone in das Projekt hinzufügen. Das war irgendwie ein dummer Fehler von mir, weil dieses C++ Projekt wahrscheinlich diese Abhängigkeit mit sich selbst trug (es gibt mehrere winmd Referenzen darin, aber ich konnte nicht erraten, dass sie Teil der SQLite for Windows Phone basierend auf ihren obskuren Namen sein würden).

1

Werkzeuge + Optionen, Projekte und Lösungen, Build and Run. Ändern Sie die Einstellung "MSBuild-Projekt Build-Ausgabe Ausführlichkeit" auf Normal.

Achten Sie auf die Build-Ausgabe, die Nachrichten, die Sie nach "XapPackager" sehen. Welche zeigen an, welche Dateien zum Xap-Paket hinzugefügt werden? Ihre DLL muss in dieser Liste enthalten sein. Wenn dies nicht der Fall ist, wird Ihr Programm wie beschrieben fehlschlagen. In diesem Fall müssen Sie herausfinden, warum es übersprungen wird. Starten Sie das, indem Sie überprüfen, dass die Local Copy-Eigenschaft der .winmd-Referenz True ist.

+0

Vielen Dank für Ihre Antwort. Die Eigenschaft "Lokal kopieren" ist auf "Wahr" festgelegt. und die Dateien 'winmd' und' all' sind in der Liste nach 'Begin Xap packaging'. Ich habe die Situation in meinem ursprünglichen Beitrag etwas vereinfacht; Ich habe eine C++ - Datei, die eine 'dll' und eine' winmd' erzeugt, diese 'winmd' wird in einem WP8-Klassenbibliotheksprojekt verwendet, das eine' dll' erzeugt, die in einem "konkreten" WP8-Projekt verwendet wird. Die zwei Dateien 'dll' und' winmd' werden während des Builds korrekt kopiert. – Max

+0

Sie helfen mir nicht, Ihnen zu helfen. "alle Dateien? Zwei dlls? Sie haben jetzt eine Möglichkeit zu diagnostizieren, was zwischen den beiden Ansätzen unterscheidet, aber keine erwähnt. Ich habe keine detaillierte Ausnahmebedingung, um sie anzusehen. Ich würde eine Projektverweis empfehlen, wenn Sie es nicht besser dokumentieren können. –

+0

Es tut mir leid, ich meinte "winmd" und "dll" Dateien, mein Finger rutschte irgendwie auf die a-Taste ... – Max

0

Ich wollte nur meine Erfahrung, um die Antwort hinzuzufügen ..

Wenn Sie (für Windows Phone 8.1 app in meinem Fall) eine C++ Bibliothek direkt an C# -Code hinzufügen möchten, dann die .winmd einschließlich Datei aktiviert die Kompilierung, aber die App stürzt beim Start ab. Der Stack-Trace sagt nur, dass C++ DLL nicht geladen werden konnte.

Ich musste auch Verweis auf Visual Studio C++ - Laufzeitbibliothek in der C# -Anwendung hinzufügen. Ich habe von der fehlenden Referenz erfahren, indem ich die Arbeit diffamierte.xap (erstellt aus einer Lösung, die sowohl C# - als auch C++ - Projekte enthält) und nicht funktionierende .xap (erstellt aus einer Lösung, die nur C# -Projekt zusammen mit Verweis auf C++ .winmd-Datei enthält)

Verwandte Themen