Недавно я разработал пользовательский элемент управления взаимодействия в .NET (Visual Studio 2008, проект, нацеленный на .NET 2.0) для использования в приложении VB6. Сборка выставляет 1 элемент управления, 1 класс и несколько перечислений и структур. Я разработал его с использованием переводов C # Interop Forms Toolkit 2.0 шаблона проекта , найденного здесь . Сборка имеет строгое имя и устанавливается в GAC и регистрируется в regasm с помощью следующего сценария:
@"C:\gacutil.exe" /i "C:\Program Files\AppName\Control.dll" /f
@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe" "C:\Program Files\AppName\Control.dll" /tlb:"C:\Program Files\AppName\Control.tlb"
Проблема: Когда я компилирую приложение VB6 на моем компьютере, оно будет нормально работать на любом другом компьютере (конечно, установленный элемент управления). Однако, когда приложение скомпилировано на другом компьютере, оно будет работать на этом компьютере, но не на любом другом компьютере. И когда я говорю, что он не запускается, я имею в виду, что вы пытаетесь запустить его, и абсолютно ничего не происходит.
Я использовал OleView для проверки управления как на моей машине, так и на другой машине, и все GUID одинаковы в информации о типе. Единственным отличием было то, что у одной была строка importlib ("stdole2.tlb"), а у другой - importlib ("STDOLE2.TLB").
Моя машина имеет: Visual Studio 6.0 sp6, шаблоны управления взаимодействием пользователей VB6, Windows SDK 6.0 и 6.0A, Visual Studio 2008 sp1. Это машина, которая работает.
Сотрудники: Visual Studio 6.0 sp6, Visual Studio 2005
Другая машина: Visual Studio 6.0 sp6, Visual Studio 2008. 2008 была установлена сегодня утром и не устранила проблему.
Как заставить эти другие машины правильно скомпилировать приложение VB6, чтобы оно работало на машинах, отличных от той, на которой оно было скомпилировано?
(Оставьте запросы на дополнительную информацию в комментариях, и я отредактирую это, чтобы предоставить ответы.)
редактирует:
Было внесено предложение относительно разрешений в отношении регистрации контроля. Я хотел бы уточнить, что контроль, кажется, работает хорошо. Я регистрирую это точно так же на машине, которая работает, и на тех, которые не работают. Проблема проявляется, когда приложение VB6, которое ссылается на элемент управления, скомпилировано на компьютере, отличном от моего.
Я должен также добавить, что у меня было небольшое хост-приложение VB6, которое имело 1 форму, элемент управления взаимодействием и пару кнопок. Это не та же проблема, что и у основного приложения VB6.
Возможно, подсказка
Если кто-то знаком с использованием OleView.exe, я думаю, что, возможно, обнаружил подсказку. Когда я просматриваю список библиотек типов, появляется «OrderControl (версия 0.1)», а также «OrderControlCtl (версия 0.1)». Первый использует GUID, определенный для сборки, а путь показывает файл OrderControl.tlb, созданный с помощью RegAsm.exe. Второй имеет разные идентификаторы GUID на разных компьютерах, и мой путь - «C: \ Program Files \ Microsoft Visual Studio \ VB98 \ vbc00305.oca», путь на другом компьютере - «C: \ Program Files \ Microsoft Visual Studio». \ VB98 \ mscoree.oca ", и на компьютере сотрудника находится" C: \ windows \ system32 \ mscoree.oca ". Оба файла mscoree.oca имеют одинаковый размер, но размер vbc00305.oca на моей машине на несколько КБ меньше.
Я снова посмотрел ссылки на проект VB6. Список ссылок содержит OrderControl и OrderControlCtl, но проверяется только OrderControlCtl. Расположение OrderControl - это файл TLB, но расположение OrderControlCtl - это файл OCA, который отличается на каждой станции.
Зависимость Уокер
Я запустил профили в DW для версии exe, скомпилированной на моей машине, и одной версии, скомпилированной на нашей сборочной машине (которая не будет работать на моей). Они расходятся в следующие 2 строки. Оба имеют первую строку, но та, которая работает, продолжается с большим количеством вызовов / загрузок, в то время как та, которая не запускается, сразу же начинает отсоединяться после первой строки:
GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32RedirectTypeLibrary") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E746129.
GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32MapConfiguredClsidToReferenceClsid") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E745C0D.