VB6 в COM-вызываемую оболочку .NET - проблемы с поиском библиотек .NET - PullRequest
2 голосов
/ 22 сентября 2011

Предпосылка:

  • Написал вызываемую COM-оболочку (CCW), написанную на C #, для вызова кодом VB6.
  • Код C # имеет библиотеки .NET ( сторонние ), которые он должен использовать.
  • Обернутый класс C # инстанцирует нормально, вызывает события правильно, правильно принимает вызовы метода.

Проблема:

  • Код VB6 при запуске кода C # получает ошибку, когда код C # пытается получить доступ к дополнительным библиотекам .NET, упомянутым выше.

Процесс проверен:

  • C # завернутый код завершен.
  • Написан код VB6, ссылка на созданный COM dll.
  • Ошибка "Файл не найден ...", когда код C # пытается получить доступ к библиотекам .NET изнутри.
  • Скопировал сторонние библиотеки .NET в основную папку кода VB6 (также в папку system32).
    • Все еще ошибка "Файл не найден ...".
  • Написал тестовый проект C # Windows Form. Ссылка на обернутый код C #.
    • Получена та же ошибка, что и код VB6.
  • В тестовом проекте C # Windows Form ссылается на библиотек .NET, используемых упакованным кодом C #.
    • Программа работала просто отлично.

Заключение / Вопрос:

  • Может ли VB6 вызывать / использовать обернутую в C # программу, которая ссылается на другие сторонние библиотеки .NET?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2011

Это несколько отразит ответ Криса Эриксона.

Во-первых, для моего использования, которое решает эти проблемы, я не использовал GAC.Предполагая, что мое приложение VB6 находится в каталоге c: \ program files \ mycompany \ vb6app.exe, я поместил дружественный к COM .NET dll (назовем его net4vb.dll) в папку с исполняемым файлом.Затем я регистрирую dll с помощью RegAsm, используя параметр / codebase.Наконец, я помещаю сборку .NET, которую я обертываю или использую (назовем ее purenet.dll), в эту папку.

На этом этапе vb6app.exe должен работать без ошибок.

Важно отметить, что если вы выберете «Зарегистрироваться для COM-взаимодействия» в Visual Studio, он перезапишет регистрацию, которую вы сделали выше.Поэтому не используйте эту опцию.Придерживайтесь инструментов командной строки только для этого.

0 голосов
/ 23 сентября 2011

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

  1. Копированиеони в том же каталоге, что и ваш код VB6, ничего не сделают, эффективный каталог кода VB6 при запуске в отладчике VB6 - это% ProgramFiles% \ Microsoft Visual Studio \ VB98, поэтому выполняющийся код не будет видеть этого.
  2. Каталог system32 не имеет ничего общего с dotNet dll (единственные DLL, на которые они будут влиять, это PInvoke'd dll, и вы говорите, что добавляете ссылку, чтобы это не так).

Добавление сторонней библиотеки в GAC должно исправить ситуацию, однако это не обязательно возможно / просто из-за необходимости подписывать DLL.Так что просто убедитесь, что библиотеки, на которые вы ссылаетесь, находятся в каталоге ВАШЕЙ библиотеки и что VB6 фактически ссылается на эту версию вашей библиотеки (Debug / Release независимо от того, что было скомпилировано последним).Возможно, вы захотите передать RegAsm библиотеку, чтобы убедиться, что правильная библиотека зарегистрирована в Com Comistered.

Итак, для подведения итогов предположим, что ваш исходный код выглядит следующим образом:

c:\projects\vb6project
c:\projects\c#project

И ваш проект настроенДля отладки сторонние библиотеки должны находиться в:

c:\projects\c#project\bin\Debug

Если вы действительно хотите распространять приложение, убедитесь, что ВСЕ библиотеки находятся в том же каталоге, что и ваш VB6 exe.

...