You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ICorRuntimeHost::GetDefaultDomain已弃用,如何获取_AppDomain*?

纯非托管C++中获取默认_AppDomain*的非弃用实现方案

.NET 4.5及以上版本直接方案

.NET 4.5引入了ICLRRuntimeHost4接口,它继承自ICLRRuntimeHost并新增了GetDefaultDomain方法,无需依赖已弃用的ICorRuntimeHost:

  • 基于已获取的ICLRRuntimeInfo* pRuntimeInfo,调用GetInterface获取ICLRRuntimeHost4*实例:
ICLRRuntimeHost4* pRuntimeHost4 = nullptr;
HRESULT hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost4, (LPVOID*)&pRuntimeHost4);
  • 调用ICLRRuntimeHost4::GetDefaultDomain直接获取_AppDomain*:
_AppDomain* pDefaultDomain = nullptr;
hr = pRuntimeHost4->GetDefaultDomain(&pDefaultDomain);
  • 使用完成后按顺序释放接口:pDefaultDomain->Release();、pRuntimeHost4->Release();

.NET 4.0兼容方案

若仅针对v4.0.30319版本,可通过ICLRRuntimeHost::ExecuteInDefaultAppDomain调用托管辅助方法间接获取:

  1. 编写托管C#辅助DLL(如AppDomainHelper.dll),实现返回默认AppDomain的静态方法:
using System;
using System.Runtime.InteropServices;

public static class AppDomainHelper
{
    [return: MarshalAs(UnmanagedType.IUnknown)]
    public static object GetDefaultDomain()
    {
        return AppDomain.CurrentDomain;
    }
}
  1. 在非托管C++代码中调用该方法,将返回的IUnknown*转换为_AppDomain*:
IUnknown* pUnkDomain = nullptr;
HRESULT hr = pRuntimeHost->ExecuteInDefaultAppDomain(
    L"AppDomainHelper.dll",
    L"AppDomainHelper",
    L"GetDefaultDomain",
    L"",
    (DWORD*)&pUnkDomain
);

_AppDomain* pDefaultDomain = nullptr;
if (SUCCEEDED(hr))
{
    hr = pUnkDomain->QueryInterface(IID__AppDomain, (LPVOID*)&pDefaultDomain);
    pUnkDomain->Release();
}
  1. 使用完成后释放pDefaultDomain。

注意事项

  • 确保辅助DLL路径正确,或放置在非托管程序的工作目录中
  • 编译托管DLL时目标框架选择对应.NET版本(v4.0)

内容的提问来源于stack exchange,提问作者Sturt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:25:24