0

コンソール アプリケーションで C# コード (.net 4.0) で C DLL を使用していて、問題に直面しています。C メソッドを呼び出すと、以下の例外が発生します。

"A call to PInvoke function 'ProcessFilesC' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature."

ここにCコードがあります

    int ProcessFilesC(
        char **p_FilesOrDirs,
        ImageInfoC **p_vecImageInfo,
        int ***p_vecStackIndexes,
        RectC ***p_vecFaces
    );    

ここに私のC#コードがあります

    [DllImport(@"..\ref\myCApp.dll", CallingConvention = CallingConvention.StdCall)]
    unsafe private static extern UInt16 ProcessFilesC(
               String[] p_FilesOrDirs,
               ref ImageInfoC[] p_vecImageInfo,
               out Int32[] p_vecStackIndexes,
               out RectC[] p_vecFaces
            );


    public unsafe struct ImageInfoC
    {            
        public String resizedFilePath;      //char*   (in C)
        public Byte isUsable;               //unsigned char (in C)
        public UInt32 imageId;              //long int in (in C)
        public UInt16 stackIndex;           //int (in C)
        public Boolean isBestPhoto;         //unsigned char  (in C)
    }

以下は、メソッドを呼び出す C# コードです。

    unsafe
        {
             iResult = ProcessFilesC(
                              p_FilesOrDirs,          // Value getting passed to DLL
                              ref p_vecImageInfo,
                              out p_vecStackIndexes,
                              out p_vecFaces
                        );
             Console.WriteLine("ProcessFilesC Complete");
        }

コードがここに到達すると、メソッドがコンソールに出力されるときに処理中であることがわかりますが、処理後に前述の例外が発生します。

これは、C DLL が出力/参照パラメーターに値を書き込もうとしていることが原因だと思います。問題がどこにあるのか、コードのどこが間違っているのかわかりません。

[ツール] -> [オプション] -> [デバッグ] -> [全般] で、[モジュールのロード時に JIT 最適化を抑制する] オプションのチェックを既に外していることに注意してください。

できるだけ早く助けてください。

この投稿を読むために貴重な時間を割いていただきありがとうございます。

ありがとう、キラン

4

1 に答える 1