Ich habe keine Ahnung, was das Problem hier ist.PInvokeStackImbalance nicht durch CallingConvention
Ich habe eine Tonne p/invoke Anrufe, die ohne Vorfall arbeiten ... außer diesem.
Ich habe es geschafft, mein Problem auf den folgenden Beispielcode zu reduzieren.
Wenn ich entweder Strukturelement (entweder das Double oder das Int) entfernt, funktioniert es gut.
Ich nehme an, das Problem ist irgendwie mit dem Layout der Struktur verbunden - aber wenn ich eine sizeof() in C und eine Marshal.SizeOf() in C#, sie beide geben den gleichen Wert zurück ... so Wenn die Strukturgröße in C# und C gleich ist, was könnte das Problem sein?
Ich vermisse hier offensichtlich etwas Grundlegendes.
SampleDLLCode.c
#pragma pack(1)
typedef struct SampleStruct {
double structValueOne;
int structValueTwo;
} SampleStruct;
__declspec(dllexport) SampleStruct __cdecl SampleMethod(void);
SampleStruct SampleMethod(void) {
return (SampleStruct) { 1, 2 };
}
Build-Skript
gcc -std=c99 -pedantic -O0 -c -o SampleDLLCode.o SampleDLLCode.c
gcc -shared --out-implib -o SampleDLL.dll SampleDLLCode.o
C# -Code
using System;
using System.Runtime.InteropServices;
namespace SampleApplication
{
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct SampleStruct {
public double structValueOne;
public int structValueTwo;
}
class Program
{
[DllImport("SampleDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern SampleStruct SampleMethod();
static void Main(string[] args)
{
SampleStruct sample = SampleMethod();
}
}
}
Nichts springt ... für das Heck von ihm, versuchen Sie die Reihenfolge der Felder in der Struktur tauschen? (beide Seiten, natürlich) – JerKimball
@JerKimball Danke fürs schauen. Das Vertauschen der Reihenfolge der Felder in der Struktur hat keine Auswirkungen. Ich bekomme immer noch die PInvokeStackImbalance MDA Warnung. – Steve
Könnte das ein Problem zwischen GCC vs .NET und dem Doppeltyp sein? Die Rückgabe einer Struktur mit cdecl kann zu compilerabhängigen Problemen führen. Überprüfen Sie dies http://stackoverflow.com/questions/13786192/methods-type-signature-is-not-pinvoke-compatible-while-calling-dll-method –