Загрузка сборок из памяти при размещении CLR в неуправляемых программах

Мне удалось разместить CLR в неуправляемой программе благодаря богатой документации.
Однако при размещении CLR кажется, что можно ограничивать загрузку сборок с жесткого диска. При запуске управляемого приложения можно загружать сборки из памяти, вызывая Assembly.Load ().

Есть ли способ выполнить сборку в размещенной CLR из памяти? Подобно:

  1. Записать управляемую сборку в память
  2. Инициировать CLR
  3. Начать CLR
  4. Выполнить управляемую сборку из памяти
  5. Подождите, пока не вернется управляемая сборка
  6. Стоп CLR

Я искал в Интернете и MSDN в течение нескольких часов, но не смог найти решение этой проблемы! Обходной путь, который я придумал, включал бы еще одну сборку, которая вызывает Assembly.Load () — Однако я боюсь, что это может быть излишним.

Заранее спасибо за любые советы или подсказки!

3

Решение

Я предлагаю вам начать с этого образца здесь: Приложение C ++ поддерживает CLR 4 и вызывает сборку .NET (CppHostCLR). кажется, делает почти то, что вам нужно. Единственная недостающая часть — это не загрузка сборки из памяти, а использование файла.

Так что вам нужно просто заменить следующие строки (в RuntimeHostV4.cpp):

// Load the .NET assembly.
wprintf(L"Load the assembly %s\n", pszAssemblyName);
hr = spDefaultAppDomain->Load_2(bstrAssemblyName, &spAssembly);
if (FAILED(hr))
{
wprintf(L"Failed to load the assembly w/hr 0x%08lx\n", hr);
goto Cleanup;
}

следующие строки, которые используют этот метод вместо: Метод _AppDomain.Load (байт [])

// let's suppose I have a LPBYTE (pointer to byte array) and an ULONG (int32) value
// that describe the buffer that contains an assembly bytes.
LPBYTE buffer = <my buffer>;
ULONG size = <my buffer size>;

// let's create an OLEAUT's SAFEARRAY of BYTEs and copy the buffer into it
// TODO: add some error checking here (mostly for out of memory errors)
SAFEARRAYBOUND bounds = { size, 0 };
SAFEARRAY *psa = SafeArrayCreate(VT_UI1, 1, &bounds);
void* data;
SafeArrayAccessData(psa, &data);
CopyMemory(data, buffer, size);
SafeArrayUnaccessData(psa);

hr = spDefaultAppDomain->Load_3(psa, &spAssembly);
if (FAILED(hr))
{
wprintf(L"Failed to load the assembly w/hr 0x%08lx\n", hr);
goto Cleanup;
}
SafeArrayDestroy(psa); // don't forget to destroy
2

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


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