Pergunta

Eu estou tentando usar um .NET assembly de VB6 através de interoperabilidade sem colocá-lo no GAC e sem utilizar o argumento / codebase para regasm.exe.

Pelo que eu entendo, quando eu corro regasm.exe em uma biblioteca de classes .NET, ele cria uma entrada de registro para cada classe na biblioteca de classes dizendo aos clientes COM eles devem carregar mscoree.dll que serve como um embrulho proxy. objetos NET para uso COM. Mscoree.dll usa a chave InprocServer32 / Montagem no Registro para a classe para determinar qual biblioteca de classe contém a implementação da classe.

Se eu usar / codebase com regasm.exe ou colocar a minha biblioteca de classes no GAC, tudo funciona OK; mas tanto quanto eu posso descobrir a partir da documentação dispersa, mscoree.dll deve olhar para a montagem no diretório atual e no caminho se / base de código não foi utilizado (e, portanto, não há nenhuma entrada CodeBase no Registro para a classe) e não pode encontrá-lo no GAC.

O código C # é tão simples como pode 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;
        }
    }
}

E os reproduz problema com um VBScript um forro que eu coloquei no mesmo diretório que a DLL compilado:

object = CreateObject("myinterop.MyServer")

O que estou ausente aqui? Existe uma descrição definitiva dos olhares maneira MSCOREE.dll até as montagens em algum lugar?

BTW, eu estou usando .NET 2.0 e sim, eu sei que eu deveria colocar minhas montagens no GAC, eu só estou perguntando por que isso não funciona como anunciado.

Foi útil?

Solução

A partir MSDN :

/ Codebase : Cria uma entrada codebase no registro. Especifica a entrada Codebase o caminho do arquivo para um conjunto que é não instalado no assembly global cache. Você não deve especificar esta opção se você quiser posteriormente instale o conjunto que você está registrar no assembly global cache. O argumento assemblyFile que você especificar com a opção / codebase deve ser um de nome forte assembly.

Parece que ela não funciona como anunciado. Se você não colocar o assembly no GAC, então você precisa usar / base de código para que o filepath é acessível.

Outras dicas

Para conseguir o que você quer, eu acho que você precisa para criar ficheiros .manifest tanto para o seu .NET montagem e sua VB6_App.EXE (referenciando o .NET assembly). Verifique Google para registro-livre COM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top