проблема передачи структуры из C # и изменения в неуправляемой DLL C ++ на CE 5

У меня есть C ++ код, который скомпилирован в Win32 и CE 5 dll. Видя, что я компилирую для обеих платформ, я использую определения препроцессора в C ++ для разделения при необходимости.

Обе библиотеки вызываются из C #, .NET 3.5 для приложения Win32 и .NET 2.0 для приложения CE.

В Win32 все работает отлично, но у меня возникают проблемы с возвратом из функции dll в CE. Функция dll, вызываемая из C #, имеет указатель структуры в качестве параметра, а содержимое структуры, которое включает строковые типы, модифицируется в функции dll.

Вот объявление функции C ++:

 DWORD __declspec(dllexport) ExtSomeFunc(LPTSTR szReader, MY_STRUCT* myStruct)

и в C #:

[DllImport("somelibrary.dll", EntryPoint = "ExtSomeFunc", CharSet = CharSet.Unicode)]
private static extern uint ExtSomeFunc([MarshalAs(UnmanagedType.LPWStr)] string szReaderName, ref MY_STRUCT myStruct);

Вот объявление структуры в C ++:

struct MY_STRUCT
{
LPTSTR szString1;
LPTSTR szString2;

MY_STRUCT()
{
szString1 = new wchar_t[32];
szString2 = new wchar_t[20];
}

~MY_STRUCT()
{
delete []szString1;
delete []szString1;
}
};

И в C #:

public struct MY_STRUCT
{
[MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 32)]
public string szString1;

[MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 20)]
public string szString2;

public MY_STRUCT(string szInit)
{
this.szString1 = szInit;
this.szString1 = szInit;
}
}

Вот как эта функция вызывается в C #:

 string szReader = "SomeDeviceName";
uint uiRet = 0;
MY_STRUCT myStruct = new MY_STRUCT("");

uiRet = ExtSomeFunc(szReader, ref myStruct);

Итак, что произойдет, если я попытаюсь заполнить строки структуры строкой длиной больше 6,

wcscpy(myStruct->szString1,  L"1234567");

или же

StringCchCopyW(myStruct->szString1, sizeReq+1, L"abcdefg");

C # никогда не возвращается из функции dll. Используя некоторые тестовые файлы регистрации, я вижу, что строки заполнены и функция завершается, но C # просто зависает, когда должен вернуться, и мне нужно выключить и выключить устройство CE для восстановления.

Уже несколько дней бьюсь головой. Это очевидно что-то с .NET 2.0 или CE 5, просто не могу понять, что и как это исправить.

Заранее спасибо!

-1

Решение

Попробуй добавить перед туром определение структуры c #:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
  • Значение пакета должно быть вашим выравниванием структуры байта.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]