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.

Était-ce utile?

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.

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