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」がスローされます。これは正しく動作するはずです。