2010-09-08 5 views
1

Si vous souhaitez utiliser un type COM dans votre C# Code, le processus est simple, non? Vous avez juste besoin d'utiliser l'importateur de bibliothèque de type et c'est très bien, mais si vous n'avez pas et vous ne pouvez pas jeter un oeil à la fichier IDL? Vous venez d'avoir le serveur DLL COM.COM à .NET interopérabilité

À titre d'exemple, essayez d'utiliser l'interface IActiveDesktop.

Quelle est l'approche utilisée pour résoudre ce genre de problème?

+0

liaison tardive. VBScript n'utilise ni tlb ni IDL pour travailler avec com. – Arseny

+0

Cela peut être utile: http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-interop/1669/How-to-create-COM-wrapper-for-IActiveDesktop –

+0

Si vous avez les outils SDK installés, Cela devrait inclure la visionneuse OLE-COM ('Oleview.exe') qui peut ouvrir typelibs (y compris ceux incorporés dans un \ .dll \) comme IDL ... Si vous n'avez pas la typelib (whic est ce que tlbimp. exe' utilise, alors vous n'avez pas de chance, sauf pour tout faire avec 'IDispatch' – Richard

Répondre

2

Il existe deux types d'interfaces COM. Celui que vous connaissez est celui qui se limite à un sous-ensemble de la spécification COM appelée "OLE Automation". Également connu sous le nom d'ActiveX avant que ce terme ne soit associé à des problèmes de sécurité.

Les interfaces compatibles avec l'automatisation sont faciles à utiliser dans pratiquement toutes les langues. Ils héritent généralement de IDispatch, ce qui leur permet d'être utilisés à partir de langages de script. Et se limiter à utiliser uniquement des types compatibles avec l'automatisation pour leurs arguments de méthode. Les choses simples, comparables aux types de valeurs .NET, BSTR pour les chaînes, SAFEARRAY pour les tableaux, VARIANT pour les arguments non typés, assez similaire à System.Object .NET.

Une autre caractéristique qu'ils supportent bien est celle des bibliothèques de types, l'équivalent des métadonnées .NET. Utilisé par un compilateur pour savoir comment appeler les méthodes d'interface. L'EDI utilise une bibliothèque de types pour générer automatiquement la bibliothèque interop afin que vous puissiez directement créer la classe wrapper et appeler les méthodes à partir du code .NET.

Eh bien, c'est la bonne nouvelle. Les mauvaises nouvelles sont qu'il y a beaucoup d'interfaces COM autour qui n'utilisent pas les restrictions d'automatisation. Ils héritent généralement de IUnknown et utilisent des arguments de fonction qui ne se marient pas bien. Comme les structures. Un composant très grand et visible dans Windows qui est comme ceci est le shell. Windows Explorer.

C'est là IActiveDesktop s'intègre aussi bien, il est une interface shell et hérite de IUnknown. Il est déclaré dans le fichier d'en-tête SDK ShlObj.h, il n'y a même pas de fichier IDL pour cela. Et par conséquent aucun moyen d'obtenir une bibliothèque de types avec sa définition. Il utilise des types d'arguments incompatibles, comme LPCWSTR (un pointeur brut vers une chaîne) au lieu de BSTR. Et des pointeurs de structure comme LPCCOMPONENT et LPWALLPAPEROPT. Le support d'interopérabilité du CLR est impuissant à le faire correctement.

Utilisation de l'interface en C# est techniquement impossible, mais vous devez redéclarer l'interface. Très soigneusement, se tromper est très facile à faire. Le fait que le code source qui fait déjà cela est très difficile à trouver est un indice à quel point c'est difficile. Cela tombe carrément dans le «pas impossible, mais quel programmeur sensé veut maintenir le code comme ça». Le shell est le domaine du code C++ non géré. Et une équipe de programmeurs hardy, car le débogage des extensions shell est assez douloureux.

+0

c'est un article instructif, donc si .NET interop exige beaucoup de travail pour faire fonctionner les choses de l'interface de base, quelle est la voie de développement alternative à prendre? MFC, VB ou quoi ?? ! –

+0

Ce n'est pas un problème d'interopérabilité .NET, vous pouvez réellement utiliser ces interfaces. Avec une énorme quantité de travail. Le problème * real * est qu'ils ont été conçus pour être utilisés à partir du code C++. Lequel, il y a 17 ans, était attendu. Aucun moyen de résoudre ce problème, ils ont pris la pilule rouge à l'époque. * Très difficile à rendre bleu. –

+0

Je n'ai pas de problème avec C++ et l'API native, mais ils ont tendance à être moins productifs lors du développement de vraies applications, j'ai pensé à utiliser C++/CLI pour bénéficier à la fois du code natif et managé. un autre problème a surgi, puisque C# supporte WPF, WCF, .. et C++ \ CLI les supporte par interop, donc comme une opinion personnelle à quoi irais-tu? –