Проблемы с вызовом DLL из .NET - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть VB6 DLL, которая оборачивает вызов стороннему компоненту.Когда я вызываю мою DLL из VB6, все работает нормально, но когда я вызываю ее из vb.net (2.0 framework target - VS2010), я получаю эту ошибку:

Произошло исключение AccessViolationException

Попытка чтения или записи защищенной памяти.Это часто указывает на то, что другая память повреждена.

Эта ошибка возникает только в Windows 7 (клиенты Windows XP работают нормально).

Я посмотрел это и всестатьи, которые я нашел, говорили о том, что декларация неверна.Я не объявляю никаких вызовов API, хотя сторонний компонент рано связан с моей библиотекой VB6.Я могу запустить DLL, установить точку останова, и она переходит в мою функцию VB6, но возникают ошибки при вызове функции в стороннем компоненте.

Моя библиотека VB6 занимает 3 строки и одну 32-битную цифру (длинная в VB6)параметры.DLL-функция третьей стороны, которую я вызываю, принимает строку (bstrDNSID в качестве строки - это то, что Intellisense показывает в VB6).Вот где это ошибки.

Кто-нибудь знает, как это может быть решено?

Обновление: Ни один из сборщиков не помог, поэтому я попытался создать тестовый саб вмоя VB6 DLL.Я жестко закодировал все значения в тестовой подпрограмме DLL.Он работает нормально при вызове из VB6, но выдает ту же ошибку, что и выше, при запуске из .NET.Также интересно, что когда я запускаю DLL VB6 из IDE VB6, я не получаю сообщение об ошибке при вызове DLL из .NET.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2012

Временное решение:

Я нашел одно решение, которое работает. Я просто создал ActiveX EXE в VB6, который называется сторонним компонентом. Работает как шарм из .NET.

Также следует отметить, что я никогда не создавал ActiveX EXE и не знал, что regsvr32 не будет работать для его регистрации. Здесь - это правильный способ регистрации ActiveX EXE.

0 голосов
/ 18 сентября 2014

VB6, вероятно, объявляет целое число как 16 бит. Это проблема с вызовом DLL из VBA тоже. Решение должно состоять в том, чтобы изменить ваше целое число на long

0 голосов
/ 08 февраля 2012

Это на самом деле не отвечает на ваш вопрос, но я не смог уместить эти примеры в комментариях.

Когда маршалинг строк в неуправляемые вызовы DLL из .NET, я иногда получал AccessViolationException, потому что я не указал правильную кодировку. Я исправил это путем явного преобразования IntPtr в нужную строку в кодировке.

[DllImport("MyDLL.dll", CharSet = CharSet.Ansi)]
static extern void do_something(IntPtr str);

void DoSomethingWrapper(string str) {
    var ptr = Marshal.StringToHGlobalAnsi(str);
    do_something(ptr);
}

Вам может понадобиться Marshal.StringToBSTR. Я не знаю, можно ли вызвать функцию VB6 с помощью указателя или вам придется создать указатель в DLL-библиотеке VB6.

Вот вопрос, который вам может пригодиться: Как я могу получить кодировку, которую использует VB6?

...