2008-10-28 3 views
4

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

Из того, что я понимаю, когда я запускаю 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 где-то ищет сборки?

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

ответ

3

От MSDN:

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

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

2

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

+0

Не знал, что вы можете это сделать. Круто! – gooli 2008-10-28 10:28:27