는 전 C# 정적 메서드 호출을 통해 관리되는 코드에서 소모품으로 C++ 및 WRL (Windows 런타임 C++ 템플릿 라이브러리)을 사용하여 WinRT 구성 요소를 만들려고합니다.만들기 WinRT 구성 요소 ++/WRL
int sum = Math.FastAdd(5,6);
나를 위해 작동하지 않는 구현은 다음과 같습니다.
무엇이 잘못 될 수 있습니까? IDL 파일에서
- 는 수학 클래스를 만들 수 있습니다. 그것은 관리 측면에서 정적 메소드를위한 호스트가 될 것입니다. IMathStatics 인터페이스를 FastAdd 메서드로 생성하십시오. 여기에는 정적 메서드가 많이 포함되어 있습니다. 정적 속성이있는 클래스는 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. 나는 public static FastAdd 메서드를 사용하여 수학 클래스를 볼 수 있습니다.
정적 메서드를 호출하는 C# 클라이언트를 생성합니다. 호출이 이루어지면 'System.InvalidCastException'이 발생합니다. 이것은 올바르게 작동 할 것으로 예상됩니다.