C++とWRL (Windows ランタイム C++ テンプレート ライブラリ) を使用してWinRTコンポーネントを作成し、 C# 静的メソッド呼び出しを介してマネージ コードで使用できるようにしたいと考えています。
int sum = Math.FastAdd(5,6);
私にとってうまくいかない実装は以下のとおりです。
ここで何が問題なのですか?
- IDLファイルで、Mathクラスを作成します。マネージ側の静的メソッドのホストになります。FastAddメソッドでIMathStaticsインターフェイスを作成します。これには、一連の静的メソッドが含まれているだけです。IMathStaticsのパラメータを持つstatic属性を持つMathクラスをマークします。
「inspectable.idl」をインポートします。 #COMPONENT_VERSION 1.0 を定義 名前空間 WRLNativeComponent { ランタイムクラス数学; [uuid(EFA9D613-BA8F-4F61-B9E7-C6BE7B7765DD)] [exclusiveto(WRLNativeComponent.Math)] [バージョン(COMPONENT_VERSION)] インターフェイス IMathStatics : IInspectable { HRESULT FastAdd([in] int a, [in] int b, [out, retval] int* value); } [uuid(650438BA-C401-49E1-8F06-58DCD5A4B685)、バージョン(COMPONENT_VERSION)] インターフェイス IMath : IInspectable { HRESULT InstanceMethod(void); } [静的 (WRLNativeComponent.IMathStatics, COMPONENT_VERSION)] [バージョン(COMPONENT_VERSION)、アクティベート可能(COMPONENT_VERSION)] ランタイムクラス 数学 { [デフォルト] インターフェイス IMath; } }
- MathStatics C++ クラスを作成します。InspectableClassStaticマクロが IMathStatics 文字列識別子を指すようにします。MathStaticsクラスの実装を指すActivatableStaticOnlyFactoryマクロを追加します。
#pragma once #include <wrl.h> #include "MyMath_h.h" // IDL から生成 名前空間 Microsoft::WRL を使用します。 名前空間 WRLNativeComponent { クラス Math : public Microsoft::WRL::RuntimeClass, ABI::WRLNativeComponent::IMath> { InspectableClass(RuntimeClass_WRLNativeComponent_Math, BaseTrust); 公衆: 数学(無効) {} 〜数学(無効){} STDMETHODIMP InstanceMethod() オーバーライド { S_OK を返します。 } }; クラス MathStatics : public Microsoft::WRL::ActivationFactory { InspectableClassStatic(InterfaceName_WRLNativeComponent_IMathStatics, BaseTrust); 公衆: MathStatics(void) {} ~MathStatics(void) {} STDMETHODIMP FastAdd(_In_ int a, _In_ int b, _Out_ int* value) オーバーライド { if (value == nullptr) return E_POINTER; *値 = a + b; S_OK を返します。 } }; ActivatableClass(数学); ActivatableStaticOnlyFactory(MathStatics); }
コンパイル後、WRLNativeComponent.winmdファイルが作成されます。public static FastAddメソッドを持つMathクラスを確認できます。
静的メソッドを呼び出す C# クライアントを構築します。呼び出しが行われると、「System.InvalidCastException」がスローされます。これは正しく動作するはずです。