Interoperabilità .NET: utilizzo di un assembly nella directory corrente
-
04-07-2019 - |
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.
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.