Несколько проблем в вашем C ++ коде.Вы возвращаете массив, для которого требуется, чтобы аргумент был SAFEARRAY **.Вы также заполняете массив неверными данными, вы создали массив строк, но вы пишете VARIANT.Не уверен, что было задумано, я сохраню варианты в кодовом исправлении:
extern "C" __declspec(dllexport) BOOL GetStringArr(SAFEARRAY** arr)
{
SAFEARRAY* myArray;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 5;
myArray = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
VARIANT* pvData = 0;
SafeArrayAccessData(myArray, (void**)&pvData);
pvData[0].vt = VT_BSTR;
pvData[0].bstrVal = SysAllocString(L"FirstString");
// etc..
SafeArrayUnaccessData(myArray);
*arr = myArray;
return true;
}
C # код:
object[] array;
bool ok = GetStringArr(out array);
[DllImport(@"blah.dll", EntryPoint = "GetStringArr")]
[return: MarshalAs(UnmanagedType.U1)]
public static extern bool GetStringArr([MarshalAs(UnmanagedType.SafeArray)] out object[] strServerList);