2010-03-04 2 views
3

Программное обеспечение, в котором я работаю для создания программного обеспечения для школ, и поэтому наши клиентские машины обычно запираются таким образом, что нам совершенно невозможно установить что-либо на нем..NET Object из VB6 без использования regasm.exe?

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

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

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

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

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

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

Marlon

+0

Вы можете «знать» это, но это неправда. Доступ не является злом и не подходит для крупных проектов. Он просто должен использоваться надлежащим образом. В ваших комментариях подразумевается, что Access даже не используется, просто Jet, так что предполагает уровень замешательства, который, вероятно, затруднит решение ваших проблем. То есть, если вы даже не понимаете важных различий в инструментах, которые вы используете, маловероятно, что вы сможете кодировать приложение, которое работает с теми инструментами, для которых ваш уровень понимания довольно туманный. –

+0

Читая ваши комментарии ниже, вы говорите, что вы «работаете с проектом MS Access, не скомпилирован VB6.exe», поэтому я смущен. Это приложение VB6 или приложение Access? Если последнее, вы должны иметь возможность обойти многие проблемы, не создавая ссылок в приложении Access и используя последнее связывание. Но ваши комментарии к CreateObject обычно указывают на то, что ваша проблема заключается в том, что вы не можете регистрировать необходимые компоненты, чтобы это не помогло. И мне непонятно, в чем проблема, т. Е. Является ли это проблемой .NET или проблемой доступа. Короче говоря, недостаточно информации, чтобы действительно дать ответ. –

+0

@David Я думаю, проблема в том, что Марлон хочет вызвать объекты C# из приложения Access. Но он не может зарегистрировать свои COM-совместимые объекты C#, потому что у пользователей нет разрешений. Вопрос в том, есть ли какой-либо метод, чтобы получить проект Access для вызова объекта C#, не требуя при этом прав администратора для регистрации объектов C#. – MarkJ

ответ

6

Вы могли бы провести 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 и других.

+0

Здравствуйте, Спасибо за сообщение, это звучит очень многообещающе. Я только что протестировал его, но при передаче объекта Domain в CORHost.CurrentDomain возникает ошибка типа «Несоответствие». Я просмотрел спецификации интерфейса, и он передает указатель, а не объект - будет ли это vb6 заботиться об этом? (извините, мои умения vb6 ограничены). – Marlon

+0

Если вы все еще получаете несоответствие типа с моим обновленным кодом, попробуйте добавить ссылку на mscorlib.tlb и объявить домен как AppDomain. – Foole

+0

Здравствуйте, у меня все еще есть несоответствие типа с этим кодом, я также попытался добавить ссылку на mscorlib.tlb, но там, похоже, нет определения для «AppDomain». Ближе всего AppDomainManager или AppDomainSetup. – Marlon

0

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

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

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

+1

В XP и более поздних COM-объектах могут быть зарегистрированы в пользовательской части реестра (HKEY_CURRENT_USER), и вы, вероятно, будете иметь разрешения на запись там из учетной записи пользователя. Вероятно, у вас не будет прав на регистрацию COM-объектов по всему миру (в HKEY_LOCAL_MACHINE). Вы можете преобразовать то, что regasm делает из HKLM в HKCU – MarkJ

+0

У regasm есть параметр, который будет создавать записи в реестре как файл - не нужно использовать монитор процесса –

4

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

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

+0

Я быстро прочитал этот учебник, единственная потенциальная проблема заключается в том, что мы работаем с проектом MS Access, а VB6.exe не скомпилирован, поэтому я не думаю, что смогу скомпилировать манифест с проектом. Однако я буду исследовать это дальше. – Marlon

+0

Вам, вероятно, понадобится поставить манифест с помощью основного исполняемого файла Access. Это несколько рискованно, и у вас могут не быть прав для этого. – MarkJ

+0

Вы можете загрузить манифест процесса во время выполнения - http://msdn.microsoft.com/en-us/library/aa375259(VS.85).aspx – wqw

1

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

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

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

Смежные вопросы