2017-02-20 8 views
1

私は自分のエクステンション(C++またはC#ライブラリを意味します)を書くことができるゲームArma 3を使っています。これらの拡張機能は、RVExtensionのためにC#のエントリポイントにこれを実装する私はDLLEXPORTためthisライブラリを使用していアンマネージコードコール、配列解析

[DllExport("[email protected]", CallingConvention = CallingConvention.Winapi)] 
public static void RvExtension(StringBuilder output, int outputSize, 
    [MarshalAs(UnmanagedType.LPStr)] string function) 
{ 
    output.Append("Foo"); 
} 

だろう、このDLLインターフェイス

void __stdcall RVExtension(char *output, int outputSize, const char *function); 
int __stdcall RVExtensionArgs(char *output, int outputSize, const char *function, const char **args, int argCnt); 

で定義されたエントリポイントを持っています。

RVExtensionArgsのエントリポイントは全く新しいものです。私はそれを実装したかったのです。これは正しく変換されていませんがargs引数に渡された配列を働く一般に

[DllExport("[email protected]", CallingConvention = CallingConvention.Winapi)] 
public static int RvExtensionArgs(StringBuilder output, int outputSize, 
    [MarshalAs(UnmanagedType.LPStr)] string function, [MarshalAs(UnmanagedType.LPArray)] string[] args, 
     int argCount) 
{ 
    output.Append("Foo"); 
} 

:私のソリューションは、これまでのところ、ここで、この一つです。渡された配列の最初の要素だけを取得します。

私はLPArray SizeConstプロパティを定義しようとしましたが、これは私が提供できない固定サイズでなければなりません。渡された配列要素は1024までです。さらに、テストコンソールでDLLにアクセスすると、MarshalExceptionが発生します。

この現象を修正するにはどうすればよいですか?

+1

代わりにSizeParamIndexを使用してください。 –

+0

これはかなり簡単でした。あなたはこれを答えとして投稿しますか? – chris579

答えて

1

完全性のために、ここではHans Passantの提案による解決策があります。

public static int RvExtensionArgs(StringBuilder output, int outputSize, 
     [MarshalAs(UnmanagedType.LPStr)] string function, 
     [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 4)] string[] args, 
     int argCount) 
{ 
    output.Append("Foo"); 
}