.NET Interop: Использование сборки в текущем каталоге
-
04-07-2019 - |
Вопрос
Я пытаюсь использовать сборку .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 без регистрации.