Как ссылаться на компонент времени выполнения Windows, написанный на C ++, из библиотеки классов, написанной на C #?

Я работаю над проектом WP8, который включает в себя проект библиотеки классов в качестве исходного кода C # и компонент среды выполнения Windows в качестве исходного кода C ++. Кто-нибудь знает, возможно ли создать такую ​​библиотеку классов C #, которая будет ссылаться на Windows Runtime Component? Конечным результатом должны быть сборка .NET и компонент времени выполнения .WIMND / .DLL, который можно использовать для приложения. В настоящее время я не могу собрать библиотеку классов, потому что она не видит Windows Runtime Component, хотя я добавила ее в проект.

Более конкретно. У меня есть, скажем, MyNs.MyClass.MyMethod (), который определен в компоненте времени выполнения C ++ и используется из библиотеки классов C #. В настоящее время я не могу скомпилировать C # из-за отсутствия метода, хотя у меня есть проект компонента среды выполнения Windows, присоединенный к тому же решению.

4

Решение

Несмотря на то, что я вмешиваюсь, потому что это не моя область, я попробовал Googling для «c # call windows runtime component» Кажется, есть много хитов / примеров, например, первый https://msdn.microsoft.com/en-us/library/hh755833.aspx.

Вам это не поможет?

0

Другие решения

Я решил эту проблему, добавив ссылку на компонент среды выполнения Windows вручную в файл .csproj библиотеки C # следующим образом

...
<ItemGroup>
<Reference Include="WindowsRuntimeComponent.winmd" />
</ItemGroup>
...
0

Мне удалось создать проект C ++ WRL и использовать класс в этом проекте из проекта C #, добавив ссылку обычным способом. Проект Wrl (не C ++ / CX, который также работает) был создан с использованием некоторого шаблона WRL, который я нашел где-то в Интернете. Проект wrl потребовал, чтобы я сделал .idl для определения интерфейса, и создал его .dll и .winmd. Вот код для тех, кто борется с этим типом вещей:

Класс Wrl:

#include "pch.h"
#include "WrlTestClass2_h.h"#include <wrl.h>

using namespace Microsoft::WRL;
using namespace Windows::Foundation;

namespace ABI
{
namespace WrlTestClass2
{
class WinRTClass: public RuntimeClass<IWinRTClass>
{
InspectableClass(RuntimeClass_WrlTestClass2_WinRTClass, BaseTrust)

public:
WinRTClass()
{
}

// http://msdn.microsoft.com/en-us/library/jj155856.aspx
// Walkthrough: Creating a Basic Windows Runtime Component Using WRL
HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value)
{
if (value == nullptr)
{
return E_POINTER;
}
*value = a + b;
return S_OK;
}

};

ActivatableClass(WinRTClass);
}
}

Код C #, который использует этот класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;namespace CSharpClientToWrl
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
WrlTestClass2.WinRTClass _winRtTestClass = new WrlTestClass2.WinRTClass();

int _answer = _winRtTestClass.Add(4, 6);

Assert.AreEqual(_answer, 10);
}
}
}

Файл .idl проекта wrl:

import "inspectable.idl"; import "Windows.Foundation.idl";

#define COMPONENT_VERSION 1.0

namespace WrlTestClass2 {
interface IWinRTClass;
runtimeclass WinRTClass;

[uuid(0be9429f-2c7a-40e8-bb0a-85bcb1749367), version(COMPONENT_VERSION)]
interface IWinRTClass : IInspectable
{       // http://msdn.microsoft.com/en-us/library/jj155856.aspx        // Walkthrough: Creating a Basic Windows Runtime Component Using WRL        HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
}

[version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)]
runtimeclass WinRTClass
{
[default] interface IWinRTClass;
} }
0