.NET Interop: Utilisation d'un assembly dans le répertoire en cours
-
04-07-2019 - |
Question
J'essaie d'utiliser un assemblage .NET à partir de VB6 via interop sans le placer dans le GAC et sans utiliser l'argument / codebase pour regasm.exe.
D'après ce que j'ai compris, lorsque j'exécute regasm.exe sur une bibliothèque de classes .NET, une entrée de registre est créée pour chaque classe de la bibliothèque de classes. Elle indique aux clients COM qu'ils doivent charger mscoree.dll qui sert d'enveloppement de proxy. Objets NET pour utilisation COM. Mscoree.dll utilise la clé InprocServer32 / Assembly dans le registre de la classe pour déterminer quelle bibliothèque de classes contient l'implémentation de la classe.
Si j'utilise / codebase avec regasm.exe ou que je mets ma bibliothèque de classes dans le GAC, tout fonctionne correctement; mais pour autant que je sache à partir de la documentation éparse, mscoree.dll devrait rechercher l’assembly dans le répertoire courant et dans le chemin si / codebase n’a pas été utilisé (et par conséquent, il n’existe pas d’entrée CodeBase dans le registre classe) et ne le trouve pas dans le GAC.
Le code C # est aussi simple que possible:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace myinterop
{
[Guid("B1D6B9FE-A4C7-11DD-B06B-E93056D89593")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class MyServer
{
public int Add(int a, int b)
{
return a + b;
}
}
}
Et le problème reproduit avec une ligne VBScript un liner que je mets dans le même répertoire que la DLL compilée:
object = CreateObject("myinterop.MyServer")
Qu'est-ce qui me manque ici? Existe-t-il une description définitive de la manière dont mscoree.dll examine les assemblys quelque part?
BTW, j'utilise .NET 2.0 et oui, je sais que je devrais mettre mes assemblages dans le GAC, je me demande simplement pourquoi cela ne fonctionne pas comme prévu.
La solution
De MSDN :
/ Codebase : crée une entrée Codebase dans le répertoire enregistrement. L'entrée Codebase spécifie le chemin du fichier pour un assemblage qui est non installé dans l'assemblage global cache. Vous ne devriez pas spécifier ceci option si vous voulez ensuite installez l'assemblage que vous êtes inscription à l'assemblée mondiale cache. L'argument assemblyFile qui vous spécifiez avec l'option / codebase doit être un assemblage fort nommé.
Il semble que cela fonctionne comme annoncé. Si vous ne placez pas votre assemblage dans le GAC, vous devez utiliser / codebase pour que le chemin du fichier soit accessible.
Autres conseils
Pour obtenir ce que vous voulez, je pense que vous devez créer des fichiers .manifest pour votre assemblage .NET et votre VB6_App.EXE (faisant référence à l'assemblage .NET). Consultez Google pour une communication sans inscription.