web-dev-qa-db-ja.com

PInvoke関数の呼び出しにより、スタックのバランスが崩れました。これは、マネージドPInvoke ..(.NET 4)が原因である可能性があります。

私のプロジェクトは、.NET Frame work 3.5でエラーなしに正常に実行されました。しかし、.NET Frame work 4をターゲットにすると、エラーが発生しました。

"PInvoke関数の呼び出しでスタックのバランスが崩れました。これは、管理されたPInvokeシグネチャが管理されていないターゲットシグネチャと一致しないためと考えられます。"

以下のようにアンマネージライブラリを使用しました。

[StructLayout(LayoutKind.Sequential )]
public class DGNElemCore
{
    public int offset;
    public int size;
    public int element_id;
    public int stype;          
    public int level;
    public int type;
    public int complex;
    public int deleted;
    public int graphic_group;
    public int properties;
    public int color;
    public int weight;
    public int style;
    public int attr_bytes;       
    public IntPtr attr_data;  
    public int raw_bytes;
    public IntPtr raw_data;                 

}

[DllImport("DgnLib.dll", EntryPoint = "DGNOpen")]           
public static extern IntPtr  DGNOpen(string fileName, int bUpdate)

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

18
taibc

これをdllインポートとともに追加します。

, CallingConvention = CallingConvention.Cdecl)]

here から取得。

プラットフォーム呼び出し

アンマネージコードとの相互運用性のパフォーマンスを向上させるために、プラットフォーム呼び出しでの誤った呼び出し規約により、アプリケーションが失敗するようになりました。以前のバージョンでは、マーシャリング層はこれらのエラーをスタックまで解決しました。

Microsoft Visual Studio 2010でアプリケーションをデバッグすると、これらのエラーが警告され、修正できます。更新できないバイナリがある場合は、アプリケーションの構成ファイルに要素を含めて、以前のバージョンと同様に、スタックで呼び出しエラーを解決できるようにすることができます。ただし、これはアプリケーションのパフォーマンスに影響を与える可能性があります。

42
Ehsan

DLLをインポートしているときに、CallingConvention.ThisCallを追加しました。

他の定数を試してみて、どれがあなたの環境で機能するかを確認してください

0
Khabri ONBBC