Как мне использовать COM без регистрации для ссылки на библиотеку DLL vb6 в проекте .net?

StackOverflow https://stackoverflow.com/questions/811894

  •  03-07-2019
  •  | 
  •  

Вопрос

Я долго пытался решить эту проблему, но, похоже, ничего не получается.

У меня есть COM-библиотека DLL, написанная на vb6.Я добавляю ссылку на эту библиотеку DLL в .net, причем для свойств 'isolated' и 'copy local' в ссылке установлено значение true.Очевидно, это должно включить com без регистрации.

Но это не работает.Если я попытаюсь на другом компьютере или отменю регистрацию библиотеки DLL с помощью regsvr32, попытка получить доступ к библиотеке DLL вызовет исключение (по сути, говорящее, что требуемый com-класс не существует).Файлы DLL и манифеста находятся в той же папке, что и EXE-файл, но он, по-видимому, просто полностью игнорирует их.

Что я делаю не так?Я прочитал тонну разрозненных статей об этом, но ни одна из них не дает мне рабочего решения.Я возился с Visual Studio, но безрезультатно.Я немного подправил make-my-manifest, но это не сработало (даже в тестовом проекте).

Это было полезно?

Решение

Я создавал и использовал класс com в не-пользовательском потоке. Очевидно, что Reg-Free com на библиотеках vb6 не работает в этой ситуации. Этот тестовый код показывает это:

Private Sub RunTest() Handles Button1.Click
    Try
        Dim x As New RegTestProject.RegTestCall
        MsgBox(x.RegTestFunction())
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Private Sub RunThreadedTest() Handles Button2.Click
    'fails if reg-free COM is used'
    Dim t As New Threading.Thread(AddressOf RunTest)
    t.Start()
End Sub

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

Другие советы

Я совершенно уверен, что когда вы ссылаетесь на COM-компоненты таким образом, импорт COM-компонентов происходит каждый раз, когда вы строите. Это означает, что COM-компонент должен быть зарегистрирован традиционным способом на каждой машине, на которой будет построен проект.

Вот такой Ссылка это описывает использование бесплатного для регистрации com-взаимодействия.Если вы уже сделали это, пожалуйста, опубликуйте свой файл манифеста.Возможно, у вас пропала опечатка.

Редактировать

Просто подумалось, что было бы проще просто зарегистрировать библиотеку dll при первом запуске приложения на новом компьютере.Бесплатный com interopt для регистрации доступен только в Windows XP и новее, поэтому, если вы нацелены на каких-либо динозавров, это не сработает.

Вот выдержка из раздела устранения неполадок MSDN статья о свободной регистрации COM. Извиняюсь, если вы уже видели это. Хорошая новость в том, что вы уже прошли через все шаги. Он предлагает воспроизвести проблему в Windows Server 2003 (возможно, с помощью виртуального ПК ?) и тогда журнал событий должен помочь.

  

Сначала получите ... ваш клиент работает с   зарегистрированный сервер; затем отменить регистрацию   сервер и убедитесь, что ваша ошибка   сообщение то, что вы ожидали; а также   наконец ... создать и развернуть манифест   файлы. Таким образом, ваше устранение неполадок   усилия ... будут ограничены   структура ваших файлов манифеста (и   правильное встраивание сборки   манифест, если вы решите это сделать).

     

При устранении неполадок без регистрации   Проблемы с COM, Просмотр событий включен   Windows Server 2003 - ваш друг ...   посмотрите в журнале системных событий события от COM-сервера.   Я не предлагаю вам взглянуть на   Журнал событий Windows XP ...   он всегда будет содержать   сообщение ... которое не помогает   определить проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top