C++ 在非托管程序中托管CLR时从内存加载程序集
多亏了丰富的文档,我成功地将CLR托管在一个非托管程序中。 但是,在承载CLR时,似乎只能从硬盘加载程序集-但在运行托管应用程序时,可以通过调用Assembly.load()从内存加载程序集 有没有办法从内存中执行托管CLR中的程序集?比如:C++ 在非托管程序中托管CLR时从内存加载程序集,c++,.net,reflection,clr,.net-assembly,C++,.net,Reflection,Clr,.net Assembly,多亏了丰富的文档,我成功地将CLR托管在一个非托管程序中。 但是,在承载CLR时,似乎只能从硬盘加载程序集-但在运行托管应用程序时,可以通过调用Assembly.load()从内存加载程序集 有没有办法从内存中执行托管CLR中的程序集?比如: 将托管程序集写入内存 启动CLR 启动CLR 从内存执行托管程序集 等待托管程序集返回 停止CLR 我已经在网上和MSDN上搜索了几个小时,但是找不到解决这个问题的方法!我提出的一个解决方法将涉及另一个调用assembly.Load()的程序集-但是我担心
提前感谢您的任何提示或提示 我建议您从这里的示例开始:这似乎可以满足您的需求。唯一缺少的部分是它没有从内存加载程序集,而是使用了一个文件 因此,您需要做的只是替换以下行(在RuntimeHostV4.cpp中): 通过以下使用此方法的行:
//假设我有一个LPBYTE(指向字节数组的指针)和一个ULONG(int32)值
//描述包含程序集字节的缓冲区。
LPBYTE缓冲区=;
乌龙大小=;
//让我们创建一个OLEAUT的安全字节数组,并将缓冲区复制到其中
//TODO:在此处添加一些错误检查(主要用于内存不足错误)
SAFEARRAYBOUND界限={size,0};
SAFEARRAY*psa=SafeArrayCreate(VT_UI1、1和边界);
作废*数据;
安全阵列访问数据(psa和数据);
CopyMemory(数据、缓冲区、大小);
安全数据(psa);
hr=spDefaultAppDomain->Load_3(psa和SpaAssembly);
如果(失败(小时))
{
wprintf(L“加载程序集失败,带hr 0x%08lx\n”,hr);
去清理;
}
安全阵列存储(psa);//别忘了销毁
您有任何错误吗?有任何示例代码可以说明这个问题吗?@SimonMourier基本上,我之所以在这个问题上添加赏金,是因为实施.NET许可证系统的人经常需要这样做。回答得很好,但很遗憾,只有这么少人参与了。祝贺你收到赏金!
// 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;
}
// 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