.NET Interop: Использование сборки в текущем каталоге

StackOverflow https://stackoverflow.com/questions/242572

Вопрос

Я пытаюсь использовать сборку .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, мне просто интересно, почему это не работает так, как рекламируется.

Это было полезно?

Решение

Из MSDN :

  

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top