Я пытаюсь загрузить и выполнить исполняемый файл 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);
}
Согласно рамочный источник для SafeArrayTypeMismatchException
(который отображается на COR_E_SAFEARRAYTYPEMISMATCH
):
Это исключение выдается, когда тип времени выполнения массива отличается от подтипа безопасного массива, указанного в метаданных.
Следовательно, я почти уверен, что это проблема:
SafeArrayCreate(VT_UI1, 1, &bounds);
VT_UI1
1-байтовое целое число без знака Но стандарт Main()
Метод в приложениях C # принимает массив 4-байтовых целых чисел со знаком. Это разные типы, отсюда и ошибка. Так что вам нужно изменить свой код на это:
SafeArrayCreate(VT_I4, 1, &bounds);
Других решений пока нет …