2013-07-19 29 views
7

私はWindows Phone 8プロジェクトとC++で書かれた別のプロジェクトを持っています。どちらも同じソリューションになっています。 C++プロジェクトは、WP8プロジェクトで使用される動的ライブラリであり、.dllファイルの上にWindows Metadaファイル(.winmd)を生成するように設定されています。"winmd"リファレンスの追加vsプロジェクト参照の追加

WP8プロジェクトでC++プロジェクトをプロジェクトリファレンスとして追加すると、すべて正常に動作します。

しかし、私は.dll自体を参照しようとしましたが、VS2012は私に許されませんでした(ライブラリは私が理解していないので完全に理解しています)。代わりに.winmdファイルを追加すると、警告/エラーなしでコンパイルされます。実行時にクラッシュします(TargetInvocationExceptionが発生しますが、これはC++ライブラリの "実際の"コードが見つからないためです)。

.winmdファイルを追加するときに、私は.dllファイルがその隣にあることを確認しました。両方のファイルをWP8プロジェクトのbinディレクトリに置くことはできません。

私はインターネット上の手がかりを見つけることができず、私に何かを与えることができれば感謝しています。何かヒントは大歓迎です!

は、ここで私が設定しようとしている些細なアーキテクチャのスキーマです:

architecture

そして、ここで発生した例外のスタックトレースです:

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() 

答えて

0

私はそれをうまく機能させることができました。元の投稿のスタックトレースが示唆するように、私は自分のアプリケーションでSQLiteを使用しています。 winmdファイルをC++プロジェクトの代わりに参照として追加すると、いくつかの依存関係が満たされていないように見えます。

したがって、私はSQLite for Windows Phoneへの参照をWP8ClassLibraryプロジェクトに追加する必要がありました。このC++自体でこの依存関係を運んプロジェクトおそらくは(それにはいくつかのwinmd参照があるが、私は彼らがあいまいな名前に基づいてSQLite for Windows Phoneの一部であると思いませんでした)ので、それは何とか鉱山のダム間違いでした。私は答えに私の経験を追加したい

1

ツール+オプション、プロジェクトとソリューション、ビルドと実行"MSBuildプロジェクトのビルド出力の冗長性"設定を標準に変更します。

「XapPackager」の後に表示されるビルド出力に注意してください。どのファイルがXapパッケージに追加されているかを示します。あなたのDLLはそのリストにある必要があります。そうでなければ、プログラムは説明どおりに失敗します。その場合、スキップされる理由を調べる必要があります。 .winmd参照のコピーローカルプロパティがTrueであることを確認して開始します。

+0

ありがとうございました。 Copy Localプロパティはtrueに設定されています。 'Winmd'と' all'ファイルは 'Begin Xap packaging 'の後にリストに表示されます。私は元の投稿の状況を少し簡略化しました。私は 'dll'と' winmd'を生成するC++ファイルを持っています。この 'winmd'はWP8クラスライブラリプロジェクトで使用され、"具体的な "WP8プロジェクトで使われている' dll'を生成します。 2つの 'dll'ファイルと' winmd'ファイルはビルド時に正しくコピーされます。 – Max

+0

あなたは私を助ける手助けをしていません。 "すべてのファイル? 2つのDLL?あなたは今、2つのアプローチの違いを診断する方法を持っていますが、何も言及していません。私はどちらかを見るために詳細な例外メッセージを持っていません。あなたがそれをより良く文書化できないなら、私はプロジェクト参照を推薦しなければならないでしょう。 –

+0

私は "winmd"と 'dll'ファイルを意味して申し訳ありません、私の指は何とか' a'キーに滑り込んでしまいました... – Max

0

..

あなたは.winmd含めて、(私の場合のWindows Phone 8.1アプリ用)C#コードに直接C++ライブラリを追加しようとしている場合ファイルはコンパイルを有効にしますが、起動時にアプリがクラッシュします。スタックトレースは、C++ dllのロードに失敗したとしか言いません。

私はまた、C#アプリケーションでのVisual Studio C++ランタイムライブラリへの参照を追加する必要がありました。私は、作業を比較することによって、欠落している参照について知りました。xap(C#プロジェクトとC++プロジェクトの両方を含むソリューションから作成)と非稼働.xap(C#プロジェクトのみを含むソリューションからC++ .winmdファイルを参照して作成)

関連する問題