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调用托管辅助方法间接获取:
- 编写托管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; } }
- 在非托管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(); }
- 使用完成后释放
pDefaultDomain。
注意事项
- 确保辅助DLL路径正确,或放置在非托管程序的工作目录中
- 编译托管DLL时目标框架选择对应.NET版本(v4.0)
内容的提问来源于stack exchange,提问作者Sturt
相关产品推荐
相关产品推荐

