Je veux créer un WinRT composant à l'aide C++ et WRL (Windows Runtime C++ Template Library) pour être consommable dans un code managé via C# appel statique de la méthode.Création composants WinRT avec des méthodes statiques en C++/WRL
int sum = Math.FastAdd(5,6);
La mise en œuvre qui ne fonctionne pas pour moi est ci-dessous.
Qu'est-ce qui ne va pas ici?
- Dans le fichier IDL créer une classe Math. Ce sera un hôte pour les méthodes statiques sur un côté géré. Créer Interface IMathStatics avec la méthode FastAdd. Celui-ci contient juste un tas de méthodes statiques. Mark Math classe avec statique attribut avec le paramètre 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; } }
- Créer MathStatics de classe C++. Let InspectableClassStatic macro pour pointer sur IMathStatics identificateur de chaîne. Ajouter ActivatableStaticOnlyFactory macro pour pointer sur MathStatics implémentation de classe.
#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); }
Après la compilation du fichier WRLNativeComponent.winmd est créé. Je peux voir le Math classe avec méthode statique statique FastAdd.
Construire le client C# pour appeler la méthode statique. Lorsque l'appel est effectué, le 'System.InvalidCastException' est levé. Cela devrait fonctionner correctement.