Load the CLR into unmanaged process takes these steps

  1. Call CLRCreateInstance to get a handle to one of three interfaces ICLRMetaHost, ICLRMetaHostPolicy, or ICLRDebugging. For the purposes of loading the CLR the interface used is ICLRMetaHost as described in the blog written by Bryan Alexander and Josh Stone. Reference the blog post for CLRVoyance linked above.
  2. Call the ICLRMetaHost::GetRuntime method with the .NET version to get a pointer to the ICLRRuntimeInfo interface.
  3. Call the ICLRRuntimeInfo::GetInterface method to get a pointer to the queried interface (ICLRRuntimeHost)
  4. Call the ICLRRuntimeHost::Start method to initialize the CLR in the process
  5. Call the ICorRuntimeHost::CreateDomain method to create an AppDomain to run the .NET assembly
  6. From the AppDomain, call Load,GetEntryPoint, and Invoke to run the .NET assembly