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