gpt4 book ai didi

c++ - 在非托管程序中托管 CLR 时从内存加载程序集

转载 作者:太空狗 更新时间:2023-10-29 21:40:04 28 4
gpt4 key购买 nike

由于丰富的文档,我设法在一个非托管程序中托管了 CLR。但是,在托管 CLR 时,似乎只能从硬盘驱动器加载程序集 - 但在运行托管应用程序时,可以通过调用 Assembly.Load() 从内存中加载程序集。

有什么方法可以从内存中执行托管 CLR 中的程序集吗?喜欢:

  1. 将托管程序集写入内存
  2. 启动 CLR
  3. 启动 CLR
  4. 从内存中执行托管程序集
  5. 等待托管程序集返回
  6. 停止 CLR

我已经在网络和 MSDN 上搜索了几个小时,但找不到解决此问题的方法!我想出的解决方法将涉及另一个调用 Assembly.Load() 的程序集 - 但是我担心这可能有点矫枉过正。

提前感谢您提供任何提示或技巧!

最佳答案

我建议您从此处的示例开始:C++ app hosts CLR 4 and invokes .NET assembly (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 Method (Byte[])

// 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

关于c++ - 在非托管程序中托管 CLR 时从内存加载程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31258514/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com