2009-08-10 8 views
0

Je suis actuellement en train de déplacer du code du C++ natif vers le C++ géré (pur). Le code implique l'interaction avec Windows Active Scripting. Actuellement, notre code natif fournit une classe appelée 'ObjectDispatch' qui implémente 'IDispatch' (en utilisant ATL). Cette implémentation de classe interroge notre propre classe 'Object' à l'exécution pour déterminer les méthodes et propriétés qu'elle prend en charge, puis transmet les appels 'IDispatch :: Invoke' à cet objet.Création d'une classe COM .NET IDispatch dont le contenu est disponible uniquement au moment de l'exécution

J'ai vu des exemples utilisant .NET COM interop qui supportent 'IDispatch', cependant ces implémentations étaient soit dérivées d'IDL ou basées sur la spécification d'une classe .NET, dont aucune ne se produit au moment de l'exécution.

Il semble que Interop .NET COM peut générer une implémentation de « IDispatch » au moment de la compilation si vous utilisez l'attribut suivant sur une classe donnée:

[ClassInterface(ClassInterfaceType::AutoDispatch)] 

Je suppose que je pourrais générer dynamiquement une classe à l'exécution qui prend en charge cet attribut. Cependant avant que je tente que je me demande si quelqu'un a des idées comment cela pourrait être réalisé par des moyens similaires qui ont été utilisés avec le code natif.

Notez qu'à ce stade, la classe 'Object' reste en tant que classe native.

+0

Je suis revenu à cette question deux ou trois fois, et je ne comprends pas vraiment ce que vous demandez ... Avez-vous un modèle d'objet natif exposé via IDispatch, et que vous voulez consommer à partir du code managé? –

+0

Oui, vous avez raison. Je suppose qu'un meilleur titre aurait été simplement "Puis-je implémenter directement IDispatch dans .net?". – karmasponge

Répondre

1

Vous avez reçu des commentaires officiels de Microsoft qui «pourraient» fonctionner. Je n'ai pas eu le temps de confirmer mais je pense que la bonne idée serait de poster au cas où quelqu'un serait intéressé.

[Guid("00020400-0000-0000-c000-000000000046"), 
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IDispatch 
    { 
     int GetTypeInfoCount(); 


    ITypeInfo GetTypeInfo(
     [MarshalAs(UnmanagedType.U4)] int iTInfo, 
     [MarshalAs(UnmanagedType.U4)] int lcid); 

    [PreserveSig] 
    int GetIDsOfNames(
     ref Guid riid, 
     [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames, 
     int cNames, 
     int lcid, 
     [MarshalAs(UnmanagedType.LPArray)] int[] rgDispId); 

    [PreserveSig] 
    int Invoke(
     int dispIdMember, 
     ref Guid riid, 
     [MarshalAs(UnmanagedType.U4)] int lcid, 
     [MarshalAs(UnmanagedType.U4)] int dwFlags, 
     ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams, 
     [Out, MarshalAs(UnmanagedType.LPArray)] object[] pVarResult, 
     ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo, 
     [Out, MarshalAs(UnmanagedType.LPArray)] IntPtr[] pArgErr); 
} 

class IImplimentIDispatch : IDispatch 
{ 
    public IImplimentIDispatch(object o) 
     { 
      _o = o; 
… 
Questions connexes