2013-07-19 3 views
7

У меня есть проект Windows Phone 8 и еще один проект, написанный на C++; оба находятся в одном и том же решении. Проект C++ является динамической библиотекой, используемой в проекте WP8, и он настроен на создание файла Windows Metada (.winmd) поверх файла .dll.Добавление ссылки «winmd» и добавление ссылки на проект

При добавлении проекта C++ в качестве ссылки на проект в проекте WP8 все работает отлично.

Однако я хотел бы непосредственно ссылаться на двоичные файлы вместо проекта, поэтому я попытался обратиться к самому .dll, но VS2012 не позволил мне (что я полностью понимаю, так как библиотека неуправляема из того, что я понимаю). Добавление файла .winmd вместо этого работает, я имею в виду, что оно компилируется без предупреждения/ошибок; но он падает во время выполнения (я получаю TargetInvocationException, который возникает из-за того, что «фактический» код библиотеки C++ не найден).

При добавлении файла .winmd я убедился, что файл .dll находится рядом с ним. Включение обоих файлов в каталог bin проекта WP8 также не работает.

Я не могу найти никаких подсказок в интернете, и я был бы вам признателен, если бы вы могли дать мне какие-либо подсказки!

Вот схема тривиальных архитектур Я пытаюсь настроить:

architecture

А вот StackTrace за исключение поднятое:

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

Ну, мне удалось заставить его работать. Поскольку stacktrace в исходном сообщении может предложить, я использую SQLite в своем приложении. Если я добавлю файл winmd в качестве ссылки вместо проекта C++, похоже, что некоторые зависимости не выполняются.

Поэтому мне пришлось добавить ссылку на SQLite for Windows Phone в проект WP8ClassLibrary. Это было как-то глупой ошибкой, потому что этот проект C++ , вероятно, несли эту зависимость с собой (в ней есть несколько ссылок winmd, но я не мог предположить, что они будут частью SQLite for Windows Phone на основе их неясных имен).

1

Инструментов + Опция, Проекты и решения, сборка и запуск. Измените параметр «Объём вывода сборки проекта MSBuild» на «Нормальный».

Обратите внимание на вывод сборки, сообщения, которые вы видите после «XapPackager». Какое отображение файлов, которые добавляются в пакет Xap. Ваша DLL должна быть в этом списке. Если это не так, ваша программа завершится неудачей, как описано. В этом случае вам нужно будет выяснить, почему его пропускают. Начните с проверки, что свойство Copy Local для ссылки .winmd имеет значение True.

+0

Благодарим вас за ответ. Свойству Copy Local установлено значение true; и оба файла 'winmd' и' all' находятся в списке, отображаемом после 'Begin Xap packaging'. Я немного упростил ситуацию в своем оригинальном посте; У меня есть файл C++, создающий 'dll' и' winmd', этот 'winmd' используется в проекте библиотеки классов WP8, который создает' dll', используемый в «конкретном» проекте WP8. Два файла 'dll' и' winmd' правильно копируются во время сборки. – Max

+0

Ты мне не помогаешь. "все файлы? Две DLL? Теперь у вас есть способ диагностировать различия между двумя подходами, но не упоминал о них. У меня нет подробного сообщения об исключении. Я бы рекомендовал ссылку на проект, если вы не можете документировать его лучше. –

+0

Извините, что я имел в виду «файлы winmd' и' dll », мой палец как-то скользнул к клавише' a' ... – Max

0

Я просто хотел, чтобы добавить свой опыт к ответу ..

Если вы пытаетесь добавить ++ библиотеку непосредственно C# код C (для Windows Phone 8.1 приложения в моем случае), то в том числе .winmd файл позволяет компиляцию, но приложение запускается при запуске. Трассировка стека только говорит, что не удалось загрузить dll C++.

Мне также пришлось добавить ссылку на библиотеку времени исполнения Visual Studio C++ в приложении C#. Я узнал о недостающей ссылке, не отличившись от работы.xap (созданный из решения, которое включает в себя как проекты C#, так и C++) и неработающий .xap (созданный из решения, которое включает только проект C# вместе со ссылкой на файл C++ .winmd)

Смежные вопросы