Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在非托管程序中托管CLR时从内存加载程序集_C++_.net_Reflection_Clr_.net Assembly - Fatal编程技术网

C++ 在非托管程序中托管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()的程序集-但是我担心

多亏了丰富的文档,我成功地将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