Маршал массив строк из кода C # в C с помощью p / invoke

Мне нужно передать массив строк C # в код C

Пример кода C

void print_string_array(const char** str_array, int length){
    for (int i = 0; i < length; ++i) {
        printf("Sting[%l] = %s\n", i, str_array[i]);
    }
}

C #, который я пробовал (это не сработало)

string foo[] = {"testing", "one", "two", "three"};  
print_string_array(foo, foo.Length);

[DllImport(my_C_dll, CharSet = CharSet.Ansi)]
private static extern void print_string_array([In][MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] sa, int length);

Сбой с System.AccessViolationException System.AccessViolationException: Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.

Я тоже пытался (это тоже не сработало)

string[] foo = {"testing", "one", "two", "three"};  
IntPtr[] s_array = new IntPtr[foo.Length];

for(int i = 0; i < foo.Length; ++i) 
{
    s_array[i] = Marshal.StringToCoTaskMemAnsi(foo[i])
}
print_string_array( s_array, s_array.Length);

[DllImport(my_C_dll, CharSet = CharSet.Ansi)]
private static extern void print_string_array(IntPtr[] sa, int length);

Это также приводит к ошибке System.AccessViolationException System.AccessViolationException: попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Кто-нибудь знает, как передать массив строк из C # в C?

Редактировать: Добавлены сообщения об ошибках по предложению от Дэвида Хеффернама. Измените size_t на int в коде C, поскольку это не влияет на то, что я пытался сделать. Все равно получите те же ошибки.

Ответы на вопрос(3)

Ваш ответ на вопрос