Pregunta

Estoy tratando de usar un ensamblado .NET de VB6 a través de interoperabilidad sin colocarlo en el GAC y sin usar el argumento / codebase para regasm.exe.

Según lo que entiendo, cuando ejecuto regasm.exe en una biblioteca de clases .NET, se crea una entrada de registro para cada clase en la biblioteca de clases que indica a los clientes COM que deben cargar mscoree.dll que sirve como ajuste de proxy. Objetos NET para uso COM. Mscoree.dll usa la clave InprocServer32 / Assembly en el registro de la clase para determinar qué biblioteca de clase contiene la implementación de la clase.

Si uso / codebase con regasm.exe o coloco mi biblioteca de clases en el GAC, todo funciona bien; pero por lo que puedo entender de la documentación dispersa, mscoree.dll debería buscar el ensamblaje en el directorio actual y en la ruta si no se ha utilizado / codebase (y, por lo tanto, no hay una entrada de Base de códigos en el registro para el clase) y no puede encontrarlo en el GAC.

El código C # es tan simple como puede ser:

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

Y el problema se reproduce con un trazador de líneas VBScript que coloco en el mismo directorio que el archivo DLL compilado:

object = CreateObject("myinterop.MyServer")

¿Qué me estoy perdiendo aquí? ¿Existe una descripción definitiva de la forma en que mscoree.dll busca los ensamblados en algún lugar?

Por cierto, estoy usando .NET 2.0 y sí, sé que debo colocar mis ensamblajes en el GAC, me pregunto por qué esto no funciona como se anuncia.

¿Fue útil?

Solución

De MSDN :

  

/ Codebase : crea una entrada Codebase en el   registro. La entrada Codebase especifica   La ruta del archivo para un ensamblaje que es   no instalado en el ensamblaje global   cache. No deberías especificar esto   opción si posteriormente   instala el ensamblaje que eres   registrarse en la asamblea global   cache. El argumento de assemblyFile que   Usted especifica con la opción / codebase   debe ser un ensamblado con nombre seguro.

Parece que funciona como se anuncia. Si no coloca su ensamblaje en el GAC, entonces necesita usar / codebase para que la ruta de acceso sea accesible.

Otros consejos

Para lograr lo que desea, creo que necesita crear archivos .manifest tanto para su ensamblaje .NET como para su VB6_App.EXE (que hace referencia al ensamblaje .NET). Compruebe Google para COM sin registro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top