我想創建一個使用C++和WRL(Windows運行時C++模板庫)是在通過C#靜態方法調用託管代碼消耗部件WinRT的組件。在C靜態方法創建的WinRT組件++/WRL
int sum = Math.FastAdd(5,6);
對我不起作用的實現如下。
這裏有什麼問題?
- 在IDL文件中創建一個數學類。它將成爲託管端的靜態方法的主機。創建 IMathStatics接口與 FastAdd方法。這個只包含一堆靜態方法。 Mark Math class with a static attribute with參數 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; } }
- 創建 MathStatics C++類。讓 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創建文件。我可以看到數學類與公共靜態FastAdd方法。
構造C#客戶端來調用靜態方法。撥打電話時,會引發'System.InvalidCastException'。這預計會正常工作。