Viken Patel Ответов: 2

Как использовать функцию DLL vb6 в C# .NET с помощью фреймворка 4.6.1


я пытаюсь использовать ActiveX VB6 dll в приложении c# .net для тестирования COM, но это дает мне ошибку времени выполнения, что класс не зарегистрирован.

я пробовал регистрироваться как в 32 битном, так и в 64 битном приложении, а также пытался ориентироваться на одно и то же

Что я уже пробовал:

Я создал проект VB6 типа ActiveX dll добавил две функции
 Public Function Name(aName As String)
MsgBox ("Your Name is " & aName)
End Function

Public Function TestName(aName As String) As String
TestName = " Hello  " & aName
End Function

Создал DLL из того же проекта.

Затем создал оболочку, используя приведенную ниже команду .

C:\Program файлы (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools>TlbImp.exe C:\Test\TestActiveX\Project1.dll /выход: C:\Test\TestActiveX\out\Project1.dll

Если я выполняю только вышеуказанную операцию, то я не получаю Project1.dll в разделе COM но тогда я регистрирую dll используя приведенный ниже код

C:\WINDOWS\system32>команду regsvr32 C:\Test\TestActiveX\Project1.dll

тогда только я получаю dll в разделе COM внутри диалогового окна VisuaL studio Add Reference

я попробовал добавить ссылку из C:\Test\TestActiveX\out\Project1.dll папка также, но каждый раз, когда я получаю ошибку времени выполнения, как показано ниже.

Система.Время Выполнения.InteropServices.COMException: 'получение фабрики COM-класса для компонента с CLSID {ID} не удалось из-за следующей ошибки: 80040154 класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).'
public string ReturnFromCOM()
    {
        TestClass testClass = new TestClass();
        return testClass.TestName(" Hello ");
    }

я не в состоянии сделать это, не знаю, чего не хватает в этих шагах. Моя ОС Windows : 64-битная Windows 10 Framework 4.6.1, а также 4.8.1, но созданное консольное приложение с Framework 4.6.1

я даже пытался изменить цель проекта на x64/x86/anyCPU, но это совсем не работает.

F-ES Sitecore

Вам не нужен tlbimp. Просто создайте dll, зарегистрируйте ее с помощью regsvr32, а затем добавьте ссылку через вкладку COM в разделе Add Reference. COM не работает так, как .net, он основан на реестре, а не на файле, поэтому вы не ссылаетесь непосредственно на dll, он не зависит от местоположения, но должен оставаться там, где вы его зарегистрировали.

2 Ответов

Рейтинг:
15

Dave Kreskowiak

Во-первых, вам вообще не нужен TlbImp.

Ваш VB6 .DLL должен быть зарегистрирован, прежде чем вы сможете его использовать. Для этого вы запускаете командную строку и переходите туда, где находится ваш файл VB6 .DLL. А ты тогда беги Команду regsvr32 filename.dll чтобы зарегистрировать свой файл .DLL. Закройте окно CMD.

Как только это будет сделано, в вашем проекте C# в обозревателе решений щелкните правой кнопкой мыши ссылки и выберите пункт Добавить ссылку. Переключите вкладку COM, и вы сможете найти свой .DLL в списке. Установите флажок рядом с ним и нажмите кнопку ОК.

После добавления ссылки вы можете использовать классы и функции в разделе .DLL в вашем коде C#.

Чтобы исследовать его .DLL, вы можете открыть окно обозревателя объектов с помощью Ctrl-W, J.

Если добавление ссылки не работает или возвращается с ошибкой, скорее всего, ваш VB6 .DLL нуждается в некоторой установленной зависимости, чтобы он работал. Мы не можем сказать вам, что это такое. Мы абсолютно ничего не знаем о вашем .DLL.


Viken Patel

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

RickZeeland

Вы можете попробовать использовать Dependency Walker, чтобы увидеть, если какие-либо зависимые dll отсутствуют, этот инструмент может быть немного запутанным, хотя для начинающих :)

Dave Kreskowiak

Я ничего не могу сказать вам о том, от чего может зависеть ваша библиотека DLL. Я ничего не знаю о нем, о том, что он делает, как он был написан ... ничего.

Как сказал Рик, Google для "Dependency Walker" и использовать его, чтобы увидеть, что ваш .DLL зависит от.

Рейтинг:
1

RickZeeland

Попробуйте запустить VS от имени администратора (если вы еще этого не сделали), в противном случае взгляните на ответы здесь: DLL VB6 импортирована в проект C# .net - класс не зарегистрирован - переполнение стека[^]


Viken Patel

пробовал и это приложение codeproject.com/Articles/154144/Using-Unmanaged-VB6-Code-in-NET , получая ту же ошибку , также попытался изменить цель x86/x64/Any CPU для этого приложения также, но тот же результат.