私は通常、あなたは、単にこのためC++ライブラリを書くことができますし、ちょうど私がC#のライブラリを開発していると私がしたいマーシャルのconstのchar **
int __stdcall RVExtensionArgs(char *output, int outputSize, const char *function, const char **args, int argCnt);
この機能を実装するアルマ3の拡張子を書いていますこの機能を実装します。機能RVExtensionArgs
は、私はargs引数のconstのchar型のポインタへのポインタに苦しんだ64ビット
のために32ビットのための[email protected]
とRVExtensionArgs
で装飾された名前を持っています。私の現在のimplementionはDLLEXPORTを使用
#if WIN64
[DllExport("RVExtensionArgs", CallingConvention = CallingConvention.Winapi)]
#else
[DllExport("[email protected]", CallingConvention = CallingConvention.Winapi)]
#endif
public static int RvExtensionArgs(StringBuilder output, int outputSize,
[MarshalAs(UnmanagedType.LPStr)] string function,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4, ArraySubType = UnmanagedType.LPStr)] string[] args,
int argCount)
からであるhere
以上の拡張機能に関するいくつかの情報しかし、この方法でゲームがクラッシュがあります。私はこれがargsのためだと確信していますが、私はそれを確認することはできません。何か不足していますか?
例外メッセージは一切ありますか? – pquest
悲しいことに、有用なデバッグ情報はありません。この場合は、DLLはゲームから読み込まれ、ゲームはデバッグできないため、私は何もデバッグできません。私も通常のRVE拡張を実装しました(リンクされたwikiページにあります)。これはうまくいきます。 – chris579
マーシャリングの推測を推測するために、byte *出力、int outputSize、byte *関数、byte ** args、int argCntのような安全でないクラスにインポートする方が簡単でパフォーマンスが向上しますか?唯一の「挑戦」は、.NET文字列のUTF-16文字をバイトに変換することです。 – hoodaticus