Comment créer un objet COM dans une application UWP? (C#)

Question: comment créer un objet COM dans une application Windows plate-forme universelle (UWP)?

Motivation: je veux passer de WPF à UWP. Étant donné que ma charge de travail exige de faire des appels vers des bibliothèques tierces accessibles uniquement par COM (autant que je sache), je dois faire des appels COM à partir de UWP.

Contexte:

  • C#
  • .NET
  • Visual Studio 2015
  • Windows 10
  • ciblage idéal de tous les dispositifs UWP, mais acceptable si limité aux ordinateurs de bureau / portables.

Background

Dans Visual Studio 2013 ("Bureau Classique" du projet dans Visual Studio 2015), j'ai utilisé le code C#

// Conceptual:
DotNetInterface comObjectInstance =
    (DotNetInterface)Microsoft.VisualBasic.Interaction.CreateObject(
        "this string specified the COM object type"
      );

// Example:  Open Excel via COM:
Excel.Application oApp = (Excel.Application)Interaction.CreateObject("Excel.Application");

Le projet Visual Studio requis une référence à Microsoft.VisualBasic utiliser Interaction.CreateObject() et la bibliothèque de type D'objet COM.

je veux utiliser ce code C# dans un Universelle Plate-forme Windows (UWP) application produite par Visual Studio 2015 d'Entreprise sur Windows 10 de l'Éducation. Je suis capable d'ajouter une référence à la bibliothèque de type de L'objet COM, mais incapable de faire référence à Microsoft.VisualBasic puisqu'il n'apparaît pas dans le Gestionnaire de référence de Visual Studio.

réflexions, solutions éprouvées, spéculations, etc.

j'ai ajouté une référence à "Windows Desktop Extensions for the UWP" en espérant qu'il pourrait permettre les appels aux fonctionnalités normales .NET, mais n'ai pas compris comment l'utiliser encore.

je suppose que même si les applications UWP ne peuvent pas fondamentalement faire D'appels COM, alors nous pourrions au moins construire un wrapper qui appelle un programme .net normal (même si par les ports réseau) qui serait à son tour capable d'exécuter l'appel COM. Comme il est clairement possible de contourner le problème, même dans le pire des cas, je pense qu'il devrait y avoir (et c'est probablement le cas) une solution fournie par Microsoft pour créer des objets COM. Mais je suppose que depuis UWP est si Nouveau, la documentation en ligne est assez rare et difficile à trouver maintenant.

mise à jour #1

Trouvé un article MSDN Win32 et COM pour Windows Runtime apps et Universelle de la Plate-forme Windows (UWP) applications, qui prétend que WinRT apps (qui inclut UWP apps) ne peut utiliser qu'un sous-ensemble d'objets COM. MSDN suggère soit d'utiliser un élément D'API COM pris en charge, soit de migrer d'une API COM non prise en charge vers un remplacement fonctionnel.

j'ai été en mesure pour trouver cet article par googler une erreur d'exécution jeté après j'ai trouvé un moyen de faire un appel COM à ma bibliothèque tierce. L'erreur:

une exception au système de type'.Runtime.InteropServices.COMException" a eu lieu dans mscorlib.ni.dll mais n'a pas été manipulé en code utilisateur

informations supplémentaires: création d'une instance du composant COM avec CLSID {[edit: GUID removed]} using Cocreatinstancefromapp a échoué en raison de l'erreur suivante: 80040154 Classe non enregistrée (Exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). S'il Vous Plaît assurez-vous que votre objet COM est dans le liste autorisée de CoCreateInstanceFromApp.

Je ne sais toujours pas s'il y a une façon intégrée d'accéder à L'API COM pour mes bibliothèques tierces. S'il n'y en a pas, ça veut peut-être dire que je vais devoir faire mon propre wrapper en utilisant des ports réseau ou quelque chose, ce qui semble mal.

10
demandé sur Nat 2015-08-17 06:23:10

4 réponses

comme vous le constatez, il n'est pas possible d'accéder à des objets COM arbitraires à partir d'une application Windows universelle. Il est probable que vos bibliothèques tierces utilisent aussi des API qui ne sont pas disponibles directement depuis L'exécution Windows.

en supposant que vous avez l'intention de mettre l'application sur la touche plutôt que de la déployer à travers le magasin, vous pouvez appeler vos objets COM et bibliothèques indirectement par un Négocié des Composants Windows Runtime pour chargé les applications du Windows Store (docs pour Windows 8.1, mais toujours valide pour Windows 10). Cette fonctionnalité est conçue pour les applications d'entreprise afin de fournir une interface utilisateur moderne tout en ayant accès aux fonctionnalités existantes.

si vous voulez vous déployer à travers le magasin, alors vous resterez limité à L'API permise dans le contexte Windows Runtime et ne pouvez pas utiliser un composant Windows Runtime négocié.

Si votre principal objectif est de déployer à travers le magasin et vous n'avez pas besoin de convertir une application Universelle, alors jetez un oeil à la prochaine Windows Pont pour le Classique des applications Windows (également appelé "Projet du Centenaire") qui permettra d'empaqueter votre projet .Net actuel pour le déploiement en magasin et permettra de l'étendre pour utiliser certaines capacités UWP.

13
répondu Rob Caplan - MSFT 2015-08-17 20:59:29

vous savez certainement que les applis UWP sont des applis sand-boxed, ils ont besoin d'une permission pour faire presque tout. Par exemple, ils ne peuvent pas accéder à l'ensemble du système de fichiers, mais seulement à une zone de stockage en bac à sable. Lorsque vous voulez qu'une application soit publiée dans le magasin Windows, Le kit de Certification de L'application vérifie que votre application ne fait pas ce qu'elle n'est pas autorisée à faire.

le lien que vous fournissez (Win32 et COM Pour Windows Runtime apps...) décrit une liste d'appels WIN32/COM autorisés. Microsoft vous permet de l'appel de ces méthodes, et seulement eux.

L'utilisation D'un objet Visual Basic COM semble hors de portée...

il s'agit de restrictions de sécurité, mais aussi de fonctionnalités disponibles: par exemple, il n'y a aucun moyen d'enregistrer un objet COM sur un téléphone Windows (regsrvr32).

Vous pouvez appeler n'importe quel objet COM (ou de l'API Win32) en C# dans une application WPF, et en C++, bien sûr. Pas sûr de ce qui se passe si vous essayez de copier/coller ce genre de code dans une application UWP. Vous pouvez être en mesure d'exécuter le code sur Windows Desktop, mais vous ne serez pas certainement en mesure de soumettre votre application à la Boutique Windows, et il ne fonctionnera pas sur d'autres plates-formes UWP. Microsoft ne donne pas beaucoup de détails sur l'appel D'objets COM à partir de l'application UWP.

je suppose que UWP n'est pas très bien adapté/Adapté/compatible avec les "vieux" objets COM... Je ne suis pas sûr de ce que cette migration de WPF à UWP vous apporterait?

1
répondu Dazzibao 2015-08-17 13:55:12

UWP ou Windows Universal Application ne sonne pas comme la bonne solution ici. UWP ne permet pas COM parce qu'il n'est pas disponible sur toutes les plateformes. Je suppose que vous souhaitez utiliser windows store pour un mécanisme de déploiement de votre application WPF actuelle. Windows 10 offre ce que microsoft appelle un pont pour les applications WPF où vous pouvez déployer votre application WPF comme un paquet appx dans le magasin windows.

espérons que vous aurez très peu à réécrire avec cette solution

pour plus d'informations sur la façon de déployer une application WPF dans un fichier APPx, voir la vidéo suivante. https://channel9.msdn.com/Events/Build/2015/2-692

0
répondu Stuart Smith 2015-08-17 16:18:34

sur l'autre site, la voie UWP/ WinRT semble être la seule voie par laquelle MS passe là OS pour des raisons de sécurité. Je ne sais pas si le bac à sable serait capable de détecter sur un vieux objet COM personnalisé appelé de l'objet autorisé une action non autorisée. J'espère que c'est possible pour le bac à sable.

0
répondu user8923303 2017-11-11 07:53:26