2016-10-17 8 views
1

C言語で記述された大きなライブラリをC#プログラムでDLLとして使用したいと思います。ほとんどのCコードはライブラリ自身の関数で使用されますが、C#プロジェクトから呼び出すことができる関数が必要です。C#StringとC Charポインタの間の変換方法

だから

__declspec(dllexport) char* test(char* a){ 
    char* b = "World"; 
    char* result = malloc(strlen(a) + strlen(b) + 1); 

    strcpy(result, a); 
    strcpy(result, b); 

    return result; 
} 

以下の例のC関数はC#コードで今があります私はusing System.Running.InteropServices; とも[DllImport("mydll.dll")]を持っているが、私は、関数を宣言するかどうかはわかりません。

public static extern char* test(char* a); C#はCのようなポインタをサポートしていないため、明らかに機能しません。

文字列をこのC関数に渡して文字列も返す必要がありますか?

+0

あなたはCライブラリを使用しなければならないのですが、C#で同じことを処理する独自のメソッドを書くことができないのですが、これはかなり正直なところです。 – MethodMan

+1

C#はポインタをサポートしていますが、ここにそれらが必要です。あなたの関数は 'int'を返しますが、' char * 'を返そうとしています - これはエラーです。そして、通常は、関数にバッファを提供するためのバッファを提供します。または、割り当てた文字列を解放するために2番目の関数をエクスポートする必要があります。 –

+0

このような文字列を返すのはリークです。適切な方法はhttp://stackoverflow.com/questions/5298268/returning-a-string-from-pinvokeを参照してください。 –

答えて

6

あなたはMarshalAs属性を探しています:動的に割り当てられたC文字列、悪い考えを返すよう

[DllImport("mydll.dll")] 
    static public int test([MarshalAs(UnmanagedType.LPStr)]String a); 

。どのようにして確実に文字列の割り当てを解除しますか?これはメモリリークのためのレシピです。 C#でバイト配列を割り当て、それを固定し、そのサイズとともにCコードに渡します。その結果、Cコードは結果をその中にコピーできます。その後、System.Text.Encoding.ASCII.GetString()を使用して文字列に変換します。

+0

はい、OPの機能が壊れていることを除いて(質問に対する私のコメントを参照してください) –

関連する問題