2010-05-19 6 views
6

Un client souhaite utiliser nos DLL .NET à partir de VB6. Ils sont conçus pour prendre en charge l'interopérabilité inverse et tout fonctionne bien ... sauf: Il existe deux programmes VB6 distincts dans deux répertoires différents. Il semble qu'il est nécessaire de faire l'une des:Comment un programme COM trouve-t-il une DLL .NET enregistrée pour COM Interop?

  1. Copiez le DLL .NET dans les deux répertoires, ou
  2. Installez la DLL .NET dans le GAC

Ceci est l'observation du client et a également soutenu par le RegAsm documentation:

Après l'enregistrement d'un assemblage à l'aide Regasm.exe, vous pouvez l'installer dans le cache d'assemblage global afin qu'il peut être activé à partir de n'importe quel client COM. Si l'assemblage ne sera activé que par une seule application, vous pouvez le placer dans le répertoire de cette application.

Je suis confus sur ce point.

Premier point de confusion:

Pour autant que je comprends, le moteur d'exécution COM localise la DLL en utilisant l'ID ID Prog/Class. Lorsque je regarde dans le Registre à l'entrée ID de classe, je vois le chemin d'accès complet à la DLL .NET dans la clé CodeBase. Pourquoi est-ce qu'un programme COM utilisant l'ID Prog/ID de classe ne localise pas la DLL .NET en utilisant le CodeBase?

Deuxième point de confusion:

Le GAC est spécifique à .NET. Comment est-ce impliqué dans la résolution des références COM?

Répondre

6

Vous avez raison COM utilise le ProgId pour accéder au ClassId afin d'accéder au serveur COM à charger. Dans le cas de DLL .NET COM, le serveur COM est en fait MSCOREE, pas la DLL .NET (la valeur de la clé par défaut sous {CLSID}/localserver32). MSCOREE, pas COM, peut alors utiliser toutes les règles qu'il veut pour trouver l'assembly .NET. À ce stade, je ne sais pas ce que .NET fait vraiment - cela nécessiterait des tests. Vous pouvez vous regarder en utilisant FUSLOGVW. Je peux cependant deviner qu'il charge l'assemblage comme s'il chargeait n'importe quel autre assemblage .NET.

En supposant qu'il appelle simplement Assembly.Load() avec la valeur ClassName, il suivra le .NET binding rules. Premier coup d'oeil dans le GAC, s'il n'est pas trouvé va tester - donc si une base de code est définie, elle ne regardera que là, sinon elle sondera en fonction de la base de l'application (par défaut le répertoire de l'application [mais pas pour ASP.NET ]).

Je pense que cela correspond à ce que vous lisez dans regasm.

Votre question est si vieux que je suppose qu'il a été OBE, mais les règles que vous utiliserait pour mettre ensembles dans le répertoire d'applications, utiliser une base de code ou dans le GAC sont les mêmes et w/o com interop. Chaque situation est différente et je n'ai pas fait assez .NET pour abandonner toute idée profonde. Je préfère les installations de xcopy, donc j'irais dans le répertoire de l'application (et j'utiliserai registration free COM) mais il y a d'autres considérations comme si les deux applications vb doivent utiliser la même version de l'objet COM.

Questions connexes