2016-12-13 9 views
0

C++プロジェクトにプラグインを書き込むと、管理された.NETコードでC関数を公開できるUnmanagedExports Nugetパッケージを利用しています。 https://www.nuget.org/packages/UnmanagedExportsStringBuilderを使用してpinvoke char * []を無効にする

Iは以下 私は仕事このために定義したUnmanagedExport方法である(Cでのchar *として定義++)は、文字列を受信し、プラグインを作成しました。

[DllExport("GetString", CallingConvention = CallingConvention.Cdecl)] 
public static void GetString(StringBuilder MyString) 
{    
    //Use and modify the StringBuilder. It receives the string passed and returns the modified version because it is being passed by reference. 
} 

上記のコードは美しく実行されます。

ここで問題は、UnmanagedExportコードに文字列配列を渡すことができることです。 C++は呼び出しにchar * []を要求すると定義しています

これは機能しません。

[DllExport("GetString", CallingConvention = CallingConvention.Cdecl)] 
public static void GetString(StringBuilder[] MyString) 
{    
} 
+1

ゴールデンルールは、同じ引数をとり、printf()でその値を表示するC関数を最初に書くことです。あなたは完全に問題を発見することが保証されています:*配列の長さ?*あなたは知らない、C#は知らない、Gieseckeは知らない。アンマネージドコードをまだ十分に理解していない場合は、そのステップをスキップしないでください。 –

+0

@ HansPassant入力が正しい方向に向いてくれてありがとう。私は以下の私の答えを追加しましたが、これは私に文字列の配列を渡すことができます。配列の変更は、変更されても呼び出し元コードに反映されません。 – CathalMF

答えて

0

これは文字列[]が、そのひとつの方法の通過を可能にします。

[DllExport("GetStrings", CallingConvention = CallingConvention.Cdecl)] 
public static void GetStrings([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]string[] MyStrings, int size) 
{ 
    foreach(var s in MyStrings) 
    { 
     MessageBox.Show(s); 
    } 
} 
関連する問題