2017-02-20 19 views
1

Я работаю с игрой Arma 3, где вы можете написать свои собственные расширения (это означает, что C++ или C# библиотека). Эти расширения имеют определенную точку входа, который этот интерфейс 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); 

При реализации этого в C# точка входа для RVExtension будет

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

Я использую this библиотеку для DLLExport.

В качестве точки входа для RVExtensionArgs является совершенно новым, и я хотел реализовать его. Мое решение до сих пор это один здесь:

[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"); 
} 

В целом это работает, однако массив передается для args аргумент не преобразуется должным образом. Вы получаете только первый элемент переданного массива.

Я попытался определить свойство LPArray SizeConst, но это должен быть фиксированный размер, который я не могу предоставить. Прошедшие элементы массива могут быть до 1024. Плюс я получил исключение MarshalException при доступе к DLL с помощью тестовой консоли.

Как я могу исправить это поведение?

+1

10 Not SizeConst, вместо этого используйте SizeParamIndex. –

+0

Хорошо, это было слишком легко. Вы опубликуете это как ответ, только для полноты? – chris579

ответ

1

Просто для полноты, вот решение, предложенное Хансом Пассантом.

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"); 
}