Я пытаюсь разместить CLR внутри своего приложения C++, и у меня возникают проблемы с вызовом точки входа управляемого приложения. Точка входа определяется как обычно:
static void Main(string[] args)
А вот реальный код на C++:
CComPtr<_MethodInfo> entryPoint;
hr = assembly->get_EntryPoint(&entryPoint); // this works just fine
if (FAILED(hr))
return hr;
SAFEARRAY *args =
SafeArrayCreateVector(VT_VARIANT, 1, 1); // create an array of the length of 1 ( Main(string[]) )
int argc;
LPWSTR cmdLine = GetCommandLineW();
LPWSTR *argv = CommandLineToArgvW(cmdLine, &argc); // get an array of arguments to this function
VARIANT vtPsa;
vtPsa.vt = (VT_ARRAY | VT_BSTR);
vtPsa.parray = SafeArrayCreateVector(VT_BSTR, 1, argc); // create an array of strings
for (long i = 0; i < argc; i++)
{
SafeArrayPutElement(vtPsa.parray, &i, SysAllocString(argv[i])); // insert the string from argv[i] into the safearray
}
long idx[1] = {0};
SafeArrayPutElement(args, idx, &vtPsa); // insert an array of BSTR into the VT_VARIANT args array
VARIANT obj, result;
VariantInit(&obj);
VariantInit(&result);
try
{
hr = entryPoint->Invoke_3(obj, args, &result); // call the entry point
}
catch(_com_error ex)
{
MessageBox(NULL, ex.ErrorMessage(), "Error", 0);
}
if (FAILED(hr))
{
hr = hr; // added just so I can set a breakpoint
}
Код ошибки, который я получаю, - -2146233032, что, согласно corerror.h, соответствует:
for decimal -2146233032 / hex 0x80131538 :
COR_E_SAFEARRAYRANKMISMATCH
A mismatch has occured between the runtime rank of the array and the rank recorded in the metadata.
Может кто-нибудь видит проблему?





Разве второй параметр SafeArrayCreateVector не должен быть равен 0 в обоих случаях? В MSDN это значение указано как «Нижняя граница массива. Может быть отрицательным».
После установки второго параметра на 0 в обоих случаях сообщение об ошибке изменилось на: -2147352562 / шестнадцатеричный 0x8002000e: COR_E_TARGETPARAMCOUNT corerror.h Несоответствие между количеством предоставленных аргументов и ожидаемым числом.