В приведенном ниже примере dataArray
, определенный в C ++, работает, если он определен как массив, но не как указатель (просто выдает мусорные данные).Есть ли другой способ упорядочить массив C #, чтобы он считывал указатель как массив?
C #
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct CSharpFoo{
int alpha;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5]
public int[] dataArray;
int beta;
}
C ++
struct CPPFoo{
int alpha;
//int* dataArray; //Doesn't work, even though initialized to an array elsewhere
int dataArray[5];
int beta;
}
Передается черезфункция, подобная этой
C #
[DllImport("MyDll.dll", CallingConvention = CallingConvention.Cdecl, BestFitMapping = false, ThrowOnUnmappableChar = true)]
public extern static bool InitializeDLL([MarshalAs(UnmanagedType.FunctionPtr)] ResultCallback callbackPointer);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void ResultCallback(CSharpFoo value);
C ++
//Callback
typedef void(__stdcall * ResultCallback)(CPPFoo);
__declspec(dllexport) bool InitializeDLL(ResultCallback callback);
Заранее спасибо!
Edit :: Потому что "инициализирован в массив в другом месте" не былоясно:
CPPFoo(int dummy){ //Constructor
alpha = 32;
dataArray = new int[5];
for (int i = 0; i < 5; i++){
dataArray[i] = i;
}
beta = 13;
}
//dataArray C++ {0,1,2,3,4}
//alpha C# 32
//dataArray C# {Total random garbage} (dataArray[3] is 13!)
//beta C# 0
PS, структура CPPFoo является сложной структурой, которая приходит из DLL, поэтому я не могу ее изменить.Сейчас, чтобы все заработало, я копирую его в более подходящий массив, как в ответе NonCreature0714, но это приводит к тому, что все данные копируются - дважды.Именно эту двойную копию я стараюсь избегать.
Еще одно редактирование: хотя кажется, что для структуры, содержащей один массив, значения передаются правильно, для сложной структуры мусор выбрасывается. У меня естьобновил код, чтобы отразить более сложную структуру!