Comment obtenir un COM sans inscription en travaillant dans une interoprotation gérée / non gérée

StackOverflow https://stackoverflow.com/questions/5392152

  •  28-10-2019
  •  | 
  •  

Question

J'ai un objet COM C ++ / ATL in-Process non géré (dans non géré.dll) que j'essaie d'utiliser à partir d'un c # dll (managed.dll). Cependant, je veux que je veux utiliser l'inscription gratuitement com. Je l'ai à ces étapes:

  • Enregistrez l'objet com sur la machine de développement. Le serveur en cours doit avoir une bibliothèque de type correctement enregistrée.
  • Ajoutez une référence à l'objet com dans le projet C #, puis définissez les propriétés de référence sur isolé = true.

Cela produit non géré.dll, managed.dll et native.Managed.manifest. Ouvrant le manifeste, il est assez clair comment le système l'utilise pour charger l'objet com de manière sans enregistrement.

Voici le frottement. J'ai un EXE géré (Managed.exe) qui charge dynamiquement Managed.dll pour accéder aux types publics. Ce que je veux dire par "dynamiquement", c'est qu'il utilise Assembly.LoadFrom ("managed.dll"). Lorsque le code à l'intérieur de Managed.dll essaie de créer l'objet com, il obtient une exception "classe non enregistrée". Il semble que le contexte d'activation ne soit pas correctement configuré lorsque géré.dll est chargé.

Existe-t-il un moyen d'obtenir un COM gratuite pour l'enregistrement dans ce scénario?

Était-ce utile?

La solution

Deux jours sans réponse, alors voici ce que j'ai trouvé à cette époque ...

Il semble en effet que le contexte d'activation soit configuré par le SO lors du lancement de processus en fonction du manifeste associé à l'EXE principal. Cela signifie que tous les éléments liés au COM sans enregistrement doivent être dans le main.exe.Manifest au moment où le processus est démarré. Cela brise l'isolement entre l'EXE et les DLL. Si une DLL est responsable de la création d'objets COM, vous ne vous attendriez pas à ce que le manifeste EXE devait contenir les informations COM sans Reg sans Reg. Vous avez peut-être vous attendre à ce que le manifeste associé à la DLL soit fusionné dans le contexte d'activation du processus au moment où la DLL est chargée, mais ce n'est pas le cas.

Pour contourner cela, la DLL doit configurer un nouveau contexte d'activation avant de créer l'objet com. Pour aggraver les choses, il n'y a actuellement (en ce qui concerne .NET 4.0) Aucune façon gérée de le faire. Ainsi, la DLL devra pivoter les fonctions Win32 suivantes:

J'ai enveloppé ces appels avec une classe gérée qui appelle CreateActCTX et ActivationACTCTX dans le constructeur et DeativateActctx et ReleasEActCTX dans iDisposable :: Disser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top