.NET Interop: Использование сборки в текущем каталоге - PullRequest
4 голосов
/ 28 октября 2008

Я пытаюсь использовать сборку .NET из VB6 через взаимодействие, не помещая ее в GAC и не используя аргумент / codebase для regasm.exe.

Из того, что я понимаю, когда я запускаю regasm.exe в библиотеке классов .NET, он создает запись реестра для каждого класса в библиотеке классов, сообщая клиентам COM, что они должны загрузить mscoree.dll, который служит прокси-сервером. NET объекты для использования COM. Mscoree.dll использует ключ InprocServer32 / Assembly в реестре для класса, чтобы определить, какая библиотека классов содержит реализацию класса.

Если я использую / codebase с regasm.exe или помещаю свою библиотеку классов в GAC, все работает нормально; но, насколько я могу понять из разбросанной документации, mscoree.dll должен искать сборку в текущем каталоге и в пути, если / codebase не использовался (и, следовательно, в реестре нет записи CodeBase для класс), и он не может найти его в GAC.

Код C # настолько прост, насколько может быть:

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

И проблема воспроизводится с одним вкладышем VBScript, который я помещаю в тот же каталог, что и скомпилированная DLL:

object = CreateObject("myinterop.MyServer")

Что мне здесь не хватает? Есть ли точное описание того, как mscoree.dll ищет сборки где-нибудь?

Кстати, я использую .NET 2.0 и да, я знаю, что я должен поместить свои сборки в GAC, мне просто интересно, почему это не работает так, как рекламируется.

Ответы [ 2 ]

3 голосов
/ 28 октября 2008

С MSDN :

/ Codebase : Создает запись Codebase в реестр. Запись Codebase указывает путь к файлу для сборки, которая не установлен в глобальной сборке кэш. Вы не должны указывать это вариант, если вы будете впоследствии установить сборку, которая у вас есть регистрация в глобальной сборке кэш. Аргумент AssemblyFile, который вы указываете с параметром / codebase должен быть сборкой со строгим именем.

Похоже, что он работает как рекламируется. Если вы не помещаете свою сборку в GAC, вам нужно использовать / codebase, чтобы путь к файлу был доступен.

2 голосов
/ 28 октября 2008

Чтобы достичь того, чего вы хотите, я думаю, вам нужно создать файлы .manifest как для вашей сборки .NET, так и для вашего VB6_App.EXE (ссылаясь на сборку .NET). Проверьте Google для COM без регистрации.

...