Domanda

Sto cercando di utilizzare un assembly .NET da VB6 tramite interop senza inserirlo nel GAC e senza utilizzare l'argomento / codebase per regasm.exe.

Da quanto ho capito, quando eseguo regasm.exe su una libreria di classi .NET, crea una voce di registro per ogni classe nella libreria di classi che dice ai client COM che dovrebbero caricare mscoree.dll che funge da wrapping proxy. Oggetti NET per uso COM. Mscoree.dll utilizza la chiave InprocServer32 / Assembly nel registro per la classe per determinare quale libreria di classi contiene l'implementazione della classe.

Se uso / codebase con regasm.exe o inserisco la mia libreria di classi nel GAC, tutto funziona correttamente; ma per quanto posso capire dalla documentazione sparsa, mscoree.dll dovrebbe cercare l'assembly nella directory corrente e nel percorso se / codebase non è stato usato (e quindi non c'è alcuna voce CodeBase nel registro per classe) e non riesce a trovarlo nel GAC.

Il codice C # è semplice come può essere:

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;
        }
    }
}

E il problema si riproduce con una riga VBScript che ho inserito nella stessa directory della DLL compilata:

object = CreateObject("myinterop.MyServer")

Cosa mi sto perdendo qui? Esiste una descrizione definitiva del modo in cui mscoree.dll cerca gli assembly da qualche parte?

A proposito, sto usando .NET 2.0 e sì, so che dovrei mettere i miei assembly nel GAC, mi chiedo solo perché questo non funziona come pubblicizzato.

È stato utile?

Soluzione

Da MSDN :

  

/ Codebase : crea una voce di Codebase in   Registro di sistema. Specifica la voce Codebase   il percorso del file per un assembly che è   non installato nell'assieme globale   cache. Non dovresti specificare questo   opzione se lo farai successivamente   installa il gruppo che sei   registrandosi all'assemblea globale   cache. L'argomento assemblyFile che   si specifica con l'opzione / codebase   deve essere un assembly con nome sicuro.

Sembra che funzioni come pubblicizzato. Se non si inserisce l'assembly nel GAC, è necessario utilizzare / codebase in modo che il percorso del file sia accessibile.

Altri suggerimenti

Per ottenere ciò che desideri, penso che devi creare file .manifest sia per il tuo assembly .NET che per il tuo VB6_App.EXE (facendo riferimento all'assembly .NET). Controlla Google per COM senza registrazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top