.NET Object из VB6 без использования regasm.exe? - PullRequest
3 голосов
/ 04 марта 2010

Компания-разработчик программного обеспечения, в которой я работаю, разрабатывает программное обеспечение для школ, поэтому наши клиентские машины обычно блокируются таким образом, что мы практически не можем установить на них что-либо.

Наша старая система в основном основана на (очень большом) проекте MS Access, поэтому она позволяет обойти проблемы с доступом, просто запустив локальную папку.

Передо мной была поставлена ​​задача перестроить часть системы в c # .NET - однако было бы неплохо на промежуточных этапах иметь возможность отключить проект доступа .NET.

Сегодня я несколько часов играл с com-командами, но, на самом деле, единственный способ заставить их работать - это зарегистрировать их в RegAsm.exe - и, к сожалению, это не вариант в клиентских средах.

Я пробовал GetObject / CreateObject, но ни одна из них не работает при обращении к файлу dll или tlb, есть ли другой способ добиться этого?

Идеальным решением было бы поместить dll com interop в тот же каталог, что и проект Access.

И да, прежде чем кто-то скажет это, я знаю, что MS Access - это зло и подходит только для очень маленьких проектов - но я приехал сюда только 4 месяца назад ...

Marlon

Ответы [ 4 ]

6 голосов
/ 04 марта 2010

Вы можете разместить CLR внутри Access:

Добавить ссылку на mscoree (возможно, C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ mscoree.tlb)

Sub Main()
    Dim CORHost As New mscoree.CorRuntimeHost
    Dim Domain As Object
    Dim AssemblyFilename As String
    Dim Classname As String
    Dim Result As Object

    AssemblyFilename = "mscorlib"
    Classname = "System.Collections.ArrayList"

    CORHost.Start
    CORHost.CurrentDomain Domain
    Set Result = Domain.CreateInstance(AssemblyFilename, Classname).Unwrap()

    Result.Add "test"
    MsgBox Result.Count
End Sub

Это обходит необходимость использования реестра. Обратной стороной этого является то, что вы должны использовать позднее связывание с вашими объектами.

Вы также можете добавить ссылку на mscorlib.tlb, чтобы получить информацию о типе для класса AppDomain и других.

4 голосов
/ 04 марта 2010

Пока ваши клиентские системы работают под управлением Windows XP или более поздней версии, у вас есть возможность использовать Registration Free COM . Это заменяет необходимость регистрации компонентов COM с помощью regasm (или regsvr32 для собственных COM-серверов) в системном реестре с конфигурацией XML файлы манифеста .

При этом вы все еще используете стандартные вызовы CreateObject для создания ваших объектов.

1 голос
/ 04 марта 2010

Если я использовал .Net DLL из моих проектов VB6 с помощью манифестов. Единственное требование - это исполняемый файл VB6 и DLL-библиотека .Net в одной папке.

Я использую инструмент UMMM для автоматического создания записи зависимости в манифесте приложения.

Вы можете использовать свойство ActCtx.Manifest для динамической загрузки правильного манифеста для беспрепятственного доступа к классам взаимодействия .Net.

0 голосов
/ 04 марта 2010

Вы говорите, что не можете ничего установить, но не могли бы вы внести необходимые данные в реестр самостоятельно? Я думаю, что все, что делает regasm - это записывают все некоторые данные в реестр, так что вы можете эффективно сделать это из своего VB-кода при запуске, если его там нет, и тогда вы сможете загрузить сборку взаимодействия.

вы можете использовать такой инструмент, как Process Monitor , чтобы увидеть, что записывается в реестр при запуске regasm.

Я бы удостоверился, что вы используете ключ -codebase и явно определяете Guids для ваших интерфейсов и классов для оболочек com. это не вызывало у меня никаких проблем, когда я пытался настроить com .net dll для правильной работы

...