DllImport StackOverflowException - PullRequest
       4

DllImport StackOverflowException

0 голосов
/ 04 февраля 2011

Я пытаюсь использовать C ++ DLL (Borland C Builder) из C #. Функция writeParameter работает нормально, она записывает правильные данные в файл, но у меня возникает исключение «Необработанное исключение типа« System.StackOverflowException »произошло в PresentationFramework.dll»

C ++ код:

#include <vcl.h>
#include <windows.h>
#include <fstream.h>
#pragma hdrstop
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
  return 1;
}
//---------------------------------------------------------------------------
#pragma pack (push,1)
typedef struct     
{
     int     a;
}ABC;
#pragma pack (pop)
//---------------------------------------------------------------------------

extern "C" void __declspec(dllexport) __cdecl writeParameter(ABC *abc)
{
   ofstream outfile("result.txt");
   outfile<< "A="   <<endl;
   outfile << abc->a <<endl;
   outfile.close();
}

C #:

[StructLayoutAttribute(LayoutKind.Sequential)]
public class ABC
{
    public int a;
}
[DllImport("D:\\monitorVC.dll", EntryPoint = "_writeParameter", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern void WriteParameter( 
            [In,MarshalAs(UnmanagedType.LPStruct)]
            ABC abc
            );

        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
                var abc = new ABC() {a = 123};
                WriteParameter(abc);
        }

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Прочитайте сообщение в блоге об очень плохо выбранном названии UnmanagedType.LPStruct и о том, как оно не делает то, что все думают, что оно делает. Исправьте вашу декларацию так:

[DllImport(...)]
public static extern void WriteParameter([In] ref ABC abc);
0 голосов
/ 17 июля 2012

Я знаю, что прошло много времени с тех пор, как этот вопрос был опубликован, но у меня был такой же опыт, когда я пытался загрузить проект C2010 C #, DLL, созданный с помощью CodeGear C ++ Builder 2007.

Обходным решением было удалить все TForms из моего .dll. Мне показалось, что экспортированные символы из этих форм (которые, кстати, я не мог удалить), где «приводили» загрузчик к стеку, переполняются.

Привет.

0 голосов
/ 04 февраля 2011

class! = Struct в C #.

Кроме того, упаковка вашей структуры не одинакова между версией C # и версией C ++.

...