Я пишу приложение для Магазина Windows 8 с использованием Visual Studio 2012. Основное приложение — это приложение XAML / C #, но оно также использует компонент WinRT, написанный с использованием C ++ / CX. Для компонента WinRT я использую шаблон проекта VS под названием «DLL (приложения Магазина Windows)» из диалогового окна «Новый проект». Получив этот проект, я изменяю его так, чтобы он содержал одно пространство имен с одним классом ref. Мой проект C # содержит ссылку на этот проект C ++.
Однако, когда я пытаюсь запустить мое приложение, код C # выдает исключение в тот момент, когда он пытается создать / активировать класс C ++ ref. Я видел несколько рабочих примеров этого даже на образцах MSDN. Я убедился, что DLL-библиотека компонента WinRT и файлы winmd правильно скопированы в окончательный пакет приложения, а также что приложение AppxManifest.xml правильно обновлено с правильной регистрационной информацией для класса WinRT. Однако это все еще не удается.
Я не знаю, что происходит не так. Как я могу исправить эту ошибку?
Двоичные файлы компонентов среды выполнения Windows должны иметь следующие два экспорта:
DllCanUnloadNow
DllGetActivationFactory
Когда вы используете шаблон проекта VS «DLL (приложения Магазина Windows)», ваш проект не определяет необходимый макрос, который заставляет компилятор поместить два вышеупомянутых экспорта в двоичный файл. В настройках проекта вы заметите, что набор макросов — _WINDLL. Вам нужно будет изменить это на _WINRT_DLL.
С другой стороны, правильный способ создания компонента WinRT с использованием C ++ / CX состоит в использовании шаблона проекта VS под названием «Компонент времени выполнения Windows» в Visual C ++ -> Windows Store. Использование этого создаст проект, который уже правильно настроен с правильными настройками проекта и т. Д. Для создания правильных двоичных файлов WinRT.
Других решений пока нет …