Borland Builder 2006 DLL используется в C # .Net - System.StackOverflowException - PullRequest
0 голосов
/ 23 января 2012

У меня есть старая DLL (Borland Builder 2006 C ++), которую я хочу использовать в .Net C # Visual Studio 2010. Когда я пытаюсь импортировать функции в VS всегда, я получаю исключение StackOverflowException из Visual Studio.Я уже прочитал много вещей, и импорт, кажется, легко.Но я терплю неудачу и не вижу свою ошибку.

В DLL-библиотеке Borland функции экспортируются как:

  • __declspec(dllexport) void TestFunc1() или
  • extern "C" __declspec(dllexport) void __stdcall TestFunc2()

Декорированные имена (файл * .DEF, созданный с помощью impdef и проверенный с помощью обходчика зависимостей):

  • @TestFunc1$qqsv
  • TestFunc2

В Visual Studio я импортирую таким образом:

[DllImport("MyDllName.dll", EntryPoint = "@TestFunc1$qqsv", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
public static extern void TestFunc1();

[DllImport("MyDllName.dll",CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
public static extern void TestFunc2();

В случаях стендов выдается исключение StackOverflowException из Visual studio, когда яЗвоните:

  • MyImport_Unmanaged.TestFunc1() или
  • MyImport_Unmanaged.TestFunc2()

Что не так?Кто-нибудь может мне помочь?

Интересно, когда я импортирую старую DLL, созданную в Visual Studio C ++, оформленное имя функции: _TestFunc1@0.Название довольно сильно отличается от названий Borland, но работает.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2012

У меня была такая же проблема.После многих экспериментов я понял, что проблема не в синтаксисе.Это был тот факт, что C ++ Builder DLL использовала VCL Forms.Я удалил формы, и все заработало.

0 голосов
/ 04 сентября 2013

Да, Панос, похоже, прав. Я попытался P / Invoke старая DLL BCB5 с VCL и на на первый взгляд все работало вполне нормально. Но это молча повредило программу на C #, которая проявляется в странных исключениях чуть позже. Не использовать VCL в Borland DLL было единственным способом заставить его работать. Для нас это означает, что мы должны преобразовать наш код в VisualStuidio, который в любом случае находится в списке задач.

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

правильный синтаксис: extern "C" void __stdcall __declspec (dllexport) TestFunc1 ()

...