0

C++ dll に次のメソッドがあり、p/invoke を使用して C# アプリケーションでそれを呼び出そうとしています。

void Graphics::Create(char* Project, char* Connection, int Count, char *_Source[], char *_Destination[], char *_Search[], char *_Replace[], int _Block[])

C# で使用する署名は次のとおりです。

[DllImport("Wincc.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static public extern void Create(IntPtr Project, IntPtr Connection, int Count, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Source, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Destination, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Search, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Replace, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I4)] int[] _Block);

C# で未知のメソッドを取得します。私の署名が間違っているようです。しかし、私は何が間違っているのか理解できません。

4

2 に答える 2

1

C++ には C リンケージがないため、C++関数を呼び出すことはできません。これを実現するextern "C"には、関数の前に追加します。

extern "C" {
    int foo();
}

ただし、C++メソッドでは機能しません。ただし、より醜い解決策があります。しかし、私はそれをお勧めしません。

最善の方法は、ラッパーを書き留めることです。関数のみを使用して、タスク (必要なもののみ) を C++ でラップします。関数では、これらのメソッドを呼び出すことができます。そして、Cリンケージでコンパイルします。これで、C# から呼び出すことができます。

于 2013-01-05T03:23:18.537 に答える
0

DLL を依存関係ウォーカーでチェックし、DLL に適切なエクスポートがあるかどうかを確認します。YOURDLLNAME.DEF ファイルでエクスポートを定義してみてください。このような:

YOURLLNAME.DEF

EXPORTS クリエイト

于 2013-01-05T03:23:06.570 に答える