2016-10-11 21 views
3

C#アプリケーションのDLLでC関数のライブラリを使用する必要があります。私はトラブルのcharでDLL関数を呼び出す*引数を抱えています:C#の文字列からC#に文字*を渡す

C DLLは:

extern "C" __declspec(dllexport) int CopyFunc(char *, char *); 
int CopyFunc(char *dest, char *src) 
{ 
    strcpy(dest, src); 
    return(strlen(src)); 
} 

C#のアプリはこのような何かを見ている必要があります

[DllImport("dork.dll")] 
public static extern int CopyFunc(string dst, string src); 

int GetFuncVal(string source, string dest) 
{ 
    return(CopyFunc(dest,source)); 
} 

を私は使用しての例を見てきました文字列またはStringBuilder、またはIntPtrをDLL関数プロトタイプで必要とされるchar *の代わりに使用していましたが、それらのいずれかを動作させることができませんでした。私が得る最も一般的な例外は、関数呼び出しがプロトタイプと一致しないため、PInvokeがスタックのアンバランスです。

これには簡単な解決策がありますか?

+2

'のchar *が' 1バイト文字型へのポインタです。 C#文字列はUnicodeです。あなたは最初にそれをまっすぐにする必要があります。 – PaulMcKenzie

答えて

3

あなたのPを更新/などの外部関数の宣言を起動します。

[DllImport("dork.dll")] 
public static extern int CopyFunc([MarshalAs(UnmanagedType.LPStr)]string a, [MarshalAs(UnmanagedType.LPStr)] string b); 

int GetFuncVal(string src, string dest) 
{ 
    return(CopyFunc(dest,src)); 
} 
+1

それはうまくいった。ただし、DLL関数はchar *パラメータの1つを変更します。呼び出し元の文字列 'dest'は変更されません。この変更をC#呼び出し元に返すにはどうすればよいですか? DLLのほとんどの関数は、渡されたバッファを変更します。私が実際に行う必要があるのは、バイナリデータを持つバイト配列を作成し、char *を予期するDLLに渡し、DLLから変更されたバイト配列を受け取ることです。 – user3235770

+0

文字列にキーワードを追加することをお勧めします。public static extern int CopyFunc([MarshalAs(UnmanagedType.LPStr)]文字列a、[MarshalAs(UnmanagedType.LPStr) MarshalAs(UnmanagedType.LPStr)]文字列a、[Out、MarshalAs(UnmanagedType.LPStr)]文字列b); ' – BugsFree

+0

あなたの答えをありがとう!私はこれでやり直してしまい、文字列の代わりにバイト配列を使用することですべてを動作させました。 UnmanagedTypeをLPArrayに変更する必要もありました。今私は双方向配列が期待どおりに機能している。 – user3235770