Frage

Ich versuche, eine .NET-Assembly von VB6 über Interop zu verwenden, ohne es im GAC zu platzieren und ohne das / Codebasis Argument für regasm.exe verwendet wird.

Von dem, was ich verstehe, wenn ich regasm.exe auf einer .NET-Klassenbibliothek ausführen, erstellt es einen Registrierungseintrag für jede Klasse in der Klassenbibliothek, die COM-Clients sagen, sie sollten mscoree.dll laden, die als Proxy-Verpackung dient. NET-Objekte für COM Verwendung. Mscoree.dll verwendet den InprocServer32 / Montageschlüssel in der Registrierung für die Klasse zu bestimmen, welche Klassenbibliothek der Implementierung der Klasse enthält.

Wenn ich / Code-Basis mit regasm.exe oder lege meine Klassenbibliothek im GAC, alles funktioniert OK; aber soweit ich das aus der verstreuten Dokumentation herausfinden kann, sollte mscoree.dll aussehen für die Montag im aktuellen Verzeichnis und in dem Pfad wenn / Code-Basis nicht verwendet wurde (und daher gibt es keinen Codebase-Eintrag in der Registrierung für die Klasse), und es kann nicht im GAC finden.

Der C # -Code ist so einfach wie möglich sein:

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

Und das Problem reproduziert mit einem VBScript Einzeiler, die ich im selben Verzeichnis wie die kompilierte DLL setzen:

object = CreateObject("myinterop.MyServer")

Was bin ich hier? Gibt es eine definitive Beschreibung der Art und Weise mscoree.dll irgendwo die Baugruppen nachschlägt?

BTW, ich bin mit .NET 2.0 und ja, ich weiß, ich soll meine Assemblys im GAC setzen, ich frage mich nur, warum dies nicht wie angekündigt funktioniert.

War es hilfreich?

Lösung

MSDN :

  

/ Codebase : Erstellt einen Codebase-Eintrag in der   Registrierung. Die Codebasis Eintrag gibt   der Dateipfad für eine Baugruppe, die ist   nicht in der globalen Assembly installiert   Zwischenspeicher. Sie sollten dies nicht angeben   Option, wenn Sie werden anschließend   Installieren Sie die Baugruppe, die Sie   Registrierung in die globalen Assemblierung   Zwischenspeicher. Das Argument, dass assembly   Sie mit der Option / codebase Option angeben   sein muss, eine Assembly mit starken Namen.

Es scheint, dass es funktioniert wie beworben. Wenn Sie nicht Ihre Assembly im GAC setzen, dann müssen Sie verwenden / Code-Basis, so dass der Dateipfad zugänglich ist.

Andere Tipps

Um das zu erreichen, was Sie wollen, ich glaube, Sie brauchen Dateien erstellen manifest sowohl für Ihre .NET-Assembly und Ihre VB6_App.EXE (Verweis auf die .NET-Assembly). Überprüfen Sie Google für die Registrierung frei COM.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top