.net — вызов метода сборки dotnet из C ++ возвращает ошибку COR_E_SAFEARRAYTYPEMISMATCH

Я пытаюсь загрузить и выполнить исполняемый файл dotnet из буфера памяти в моей программе на C ++.

Для этого я пытаюсь вызвать функцию Main сборки dotnet, которую я загрузил в свой проект C ++.

Сначала я загружаю CRL runtime, загружается нормально.

Затем я загружаю dotnet.exe из буфера памяти, он загружается нормально.

Затем я хотел бы запустить его, вызвав его функцию Main.

В этот момент функция Invoke_3 возвращает COR_E_SAFEARRAYTYPEMISMATCH.
Что я не понимаю почему, так как я получил параметры с помощью функции GetParameters, которая заполняет SAFEARRAY для передачи в функцию Invoke.
Кто-нибудь знает, что не так в этих параметрах?
Заранее спасибо!

// Up here we correctly load the CRL runtime

// Load up our dotnet file inside a std::string
string sFileData = FileToString("C:\\dotnet.exe");

// Copy our file data inside a SAFEARRAY
SAFEARRAYBOUND bounds = { sFileData.size(), 0 };
SAFEARRAY *pSA = SafeArrayCreate(VT_UI1, 1, &bounds);
void* data;
HRESULT hr = SafeArrayAccessData(pSA, &data);
CopyMemory(data, sFileData.c_str(), sFileData.size());
hr = SafeArrayUnaccessData(pSA);

if (pSA)
{
// Load our managed assembly:
_AssemblyPtr spAssembly = nullptr;
hr = spAppDomain->Load_3(pSA, &spAssembly);

// Get the entrypoint of the assembly, which should be the "Main" function
_MethodInfoPtr entryp;
hr = spAssembly->get_EntryPoint(&entryp);

// Get the parameters of the entrypoint function and save them in a SAFEARRAY
SAFEARRAY *pArrParams;
hr = entryp->GetParameters(&pArrParams);

// Call the entrypoint passing parameters in the SAFEARRAY.
// Returns error COR_E_SAFEARRAYTYPEMISMATCH
VARIANT retval;
hr = entryp->Invoke_3(_variant_t(), pArrParams, &retval);
}

0

Решение

Согласно рамочный источник для SafeArrayTypeMismatchException (который отображается на COR_E_SAFEARRAYTYPEMISMATCH):

Это исключение выдается, когда тип времени выполнения массива отличается от подтипа безопасного массива, указанного в метаданных.

Следовательно, я почти уверен, что это проблема:

SafeArrayCreate(VT_UI1, 1, &bounds);

VT_UI1 1-байтовое целое число без знака Но стандарт Main() Метод в приложениях C # принимает массив 4-байтовых целых чисел со знаком. Это разные типы, отсюда и ошибка. Так что вам нужно изменить свой код на это:

SafeArrayCreate(VT_I4, 1, &bounds);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]