1

このエラーを修正する方法を知っている人はいますか?

エラー:

PInvoke 関数の呼び出しにより、スタックのバランスが崩れています。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認します。

P/Invoke を使用して、マネージ コードからネイティブ コードを呼び出しています。ネイティブ コードは、ダイナミック リンク ライブラリを介してインポートされています。

ステップは

  1. これらの関数を含む .dll を見つけます。
  2. メモリへの .dll のロード
  3. メモリ内の関数のアドレスを見つける
  4. このオブジェクトのメモリ表現をデータ形式に変換する (マーシャリング)

DLL には宣言付きの関数があります

long    __stdcall Connect (long,long,long,long,long,long,long,long);`

私のアプリケーションでは、デリゲートを作成しました

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate long delConnect(long a, long b, long c, long d, long e, long f, long g, long h);`

次に、dllをロードし、メモリ内の関数のアドレスを見つけるためのクラスを作成しました

`static class NativeMethods { [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);


    [DllImport("kernel32.dll")]
    public static extern bool FreeLibrary(IntPtr hModule);
}`

関数を使用しようとすると、エラーが発生します

IntPtr pDll = NativeMethods.LoadLibrary("serial.dll");
IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "_Connect@32");
delConnect connect = (delConnect)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall,typeof(delConnect)); 
long check = connect(1, 0, 12, 9600, 0, 0, 8, 0);
bool result = NativeMethods.FreeLibrary(pDll);`

名前マングリングのため、GetProcAddress メソッドの関数名パラメーターで "Connect" の代わりに "_Connect@32" を使用しました。

デバッグ中にステートメントを含む行でこのエラーが発生します

長いチェック = connect(1, 0, 12, 9600, 0, 0, 8, 0);

4

2 に答える 2