Я хочу создать компонент WinRT, используя C ++ и WRL (библиотека шаблонов C ++ среды выполнения Windows) для использования в управляемом коде через вызов статического метода C #.
int sum = Math.FastAdd(5,6);
Ниже приведена реализация, которая у меня не работает.
Что здесь может быть не так?
- В файле IDL создайте класс Math. Это будет хост для статических методов на управляемой стороне. Создайте интерфейс IMathStatics с помощью метода FastAdd. Этот просто содержит кучу статических методов. Пометьте класс Math атрибутом static с параметром IMathStatics.
import "inspectable.idl"; #define COMPONENT_VERSION 1.0 namespace WRLNativeComponent { runtimeclass Math; [uuid(EFA9D613-BA8F-4F61-B9E7-C6BE7B7765DD)] [exclusiveto(WRLNativeComponent.Math)] [version(COMPONENT_VERSION)] interface IMathStatics : IInspectable { HRESULT FastAdd([in] int a, [in] int b, [out, retval] int* value); } [uuid(650438BA-C401-49E1-8F06-58DCD5A4B685), version(COMPONENT_VERSION)] interface IMath : IInspectable { HRESULT InstanceMethod(void); } [static(WRLNativeComponent.IMathStatics, COMPONENT_VERSION)] [version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)] runtimeclass Math { [default] interface IMath; } }
- Создайте класс C ++ MathStatics. Пусть макрос InspectableClassStatic указывает на строковый идентификатор IMathStatics. Добавьте макрос ActivatableStaticOnlyFactory, чтобы указать на реализацию класса MathStatics.
#pragma once #include <wrl.h> #include "MyMath_h.h" // generated from IDL using namespace Microsoft::WRL; namespace WRLNativeComponent { class Math : public Microsoft::WRL::RuntimeClass, ABI::WRLNativeComponent::IMath> { InspectableClass(RuntimeClass_WRLNativeComponent_Math, BaseTrust); public: Math(void) {} ~Math(void) {} STDMETHODIMP InstanceMethod() override { return S_OK; } }; class MathStatics : public Microsoft::WRL::ActivationFactory { InspectableClassStatic(InterfaceName_WRLNativeComponent_IMathStatics, BaseTrust); public: MathStatics(void) {} ~MathStatics(void) {} STDMETHODIMP FastAdd(_In_ int a, _In_ int b, _Out_ int* value) override { if (value == nullptr) return E_POINTER; *value = a + b; return S_OK; } }; ActivatableClass(Math); ActivatableStaticOnlyFactory(MathStatics); }
После компиляции создается файл WRLNativeComponent.winmd. Я вижу класс Math с помощью общедоступного статического метода FastAdd.
Создайте клиент C # для вызова статического метода. При вызове выдается System.InvalidCastException. Ожидается, что это будет работать правильно.