Приложение UWP C#, вызывающее компонент среды выполнения Windows, написанный на C++

Я пытаюсь создать компонент среды выполнения Windows (WinRT), написанный на C++(C++-cx), который можно вызвать из моего приложения UWP C#. Я следовал этому учебнику MSDN

Все прошло нормально. Я могу собрать и запустить код / ​​образец, указанный в приведенной выше ссылке на Windows-10 Desktop и Mobile
Затем я попытался создать еще более простой компонент 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. Любая помощь будет высоко оценена.

1 ответ

Решение

Вы столкнетесь с этим, если будете использовать прямую ссылку на winmd в C++ вместо ссылки P2P. Это легко проверить в вашем.csproj:

Например, ваш.csproj не должен иметь эту строку: ..\Debug\Abc_def\Abc_Def.winmd

Вместо этого рассмотрите возможность использования чего-то вроде: {1ee77824-eaa8-40f1-9b56-6f8ffa44e727} Abc_Def

Другие вопросы по тегам