c# - una - la signatura del nombre seguro no es válida para este ensamblado stdole dll
Interoperabilidad.NET: uso de un ensamblado en el directorio actual (2)
Estoy tratando de usar un ensamblado .NET desde VB6 a través de interoperabilidad sin colocarlo en el GAC y sin usar el argumento / codebase para regasm.exe.
Por lo que entiendo, cuando ejecuto regasm.exe en una biblioteca de clases .NET, crea una entrada de registro para cada clase en la biblioteca de clases y les dice a los clientes COM que deben cargar mscoree.dll que sirve como un proxy que envuelve objetos .NET para Uso de 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 utilizo / codebase con regasm.exe o coloco mi biblioteca de clases en el GAC, todo funciona bien; pero por lo que puedo deducir de la documentación dispersa, mscoree.dll debería buscar el ensamblado en el directorio actual y en la ruta si / codebase no se usó (y, por lo tanto, no hay una entrada CodeBase 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 de VBScript que puse en el mismo directorio que el archivo DLL compilado:
object = CreateObject("myinterop.MyServer")
¿Que me estoy perdiendo aqui? ¿Existe una descripción definitiva de la forma en que mscoree.dll busca los ensamblajes en alguna parte?
Por cierto, estoy usando .NET 2.0 y sí, sé que debo poner mis ensamblajes en el GAC, me pregunto por qué esto no funciona como se anuncia.
Desde MSDN :
/ Codebase : crea una entrada de Codebase en el registro. La entrada de la base de código especifica la ruta del archivo para un ensamblaje que no está instalado en el caché de ensamblaje global. No debe especificar esta opción si posteriormente instalará el ensamblaje que está registrando en el caché de ensamblaje global. El argumento assemblyFile que especifique 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 se pueda acceder a la ruta del archivo.
Para lograr lo que desea, creo que necesita crear archivos .manifest para su ensamblado .NET y su VB6_App.EXE (haciendo referencia al ensamblado de .NET). Verifique en Google el COM sin registro.