Я пытаюсь создать Среда выполнения Windows (WinRT) Компонент, написанный на C ++ (c ++ — cx), который можно вызвать из моего приложения UWP C #. Я следил за этим MSDN Учебник
Все прошло нормально. Я умею строить & запустите код / образец, указанный в приведенной выше ссылке на обоих Windows-10 Desktop & мобильный
Затем я попытался создать еще более простой компонент WinRT. Я следовал тем же шагам, что и выше. Создан проект компонента среды выполнения Windows (Файл-> Создать-> Проект-> Visual C ++ -> Windows-> Универсальный-> Компонент времени выполнения Windows (Универсальный Windows))
Теперь у моего класса есть только одна функция, GetNum который в основном возвращает uint16
Это мой заголовочный файл класса
#pragma once
#include <collection.h>
namespace WRT_sample
{
public ref class Class1 sealed
{
public:
Class1();
uint16 getNum();
};
}
Это соответствующий файл cpp:
#include "Class1.h"
using namespace WRT_sample;
using namespace Platform;
Class1::Class1()
{
}
uint16 Class1::getNum()
{
return 100;
}
Я использую те же имена классов (Class1.h & Class1.cpp), который обеспечивает VS-2015, когда я создаю новый проект WinRT.
Вот как я вызываю класс WinRT из своего кода C #:
namespace CS_WRT_sample
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
initWRT();
}
void initWRT()
{
try
{
var nativeObj = new Class1();
var num = nativeObj.getNum();
this.Result2.Text = "Num from Cpp: " + num.ToString();
Debug.WriteLine("Num from Cpp: " + num);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
this.Result3.Text = ex.Message;
}
}
}
}
Я умею строить & запустить мой код на рабочем столе (локальный компьютер x86 / x64), но когда я пытаюсь запустить его на мобильном устройстве (эмулятор x86 или устройство ARM), происходит сбой со следующей ошибкой:
Возникло исключение: System.IO.FileNotFoundException в CS_WRT_sample.exe
Указанный модуль не может быть найден. (Исключение из HRESULT: 0x8007007e) **
Это трассировка стека, которую я вижу:
System.StubHelpers.StubHelpers.GetWinRTFactoryObject (IntPtr pCPCMD)
в WRT_sample.Class1..ctor ()
в CS_WRT_sample.MainPage.initWRT ()
Мои детали VS-2015:
MS Visual Studio Professional 2015
Версия 14.0.25123.00 Обновление 2
MS .NET Framework
Версия 4.6.01038
Я не уверен, почему я затрагиваю проблему, поскольку я следовал за теми же шагами, упомянутыми в обучающей программе MSDN.
Любая помощь будет высоко оценена.
Вы столкнетесь с этим, если будете использовать прямую ссылку на winmd в C ++ вместо ссылки P2P. Это легко проверить в вашем .csproj:
Например, ваш .csproj не должен иметь эту строку: .. \ Debug \ Abc_def \ Abc_Def.winmd
Вместо этого рассмотрите возможность использования чего-то вроде:
{1ee77824-eaa8-40f1-9b56-6f8ffa44e727}
Abc_Def
Других решений пока нет …