/*** Autogenerated by WIDL 1.6 from include/mscoree.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __mscoree_h__
#define __mscoree_h__

/* Forward declarations */

#ifndef __IGCThreadControl_FWD_DEFINED__
#define __IGCThreadControl_FWD_DEFINED__
typedef interface IGCThreadControl IGCThreadControl;
#endif

#ifndef __IGCHostControl_FWD_DEFINED__
#define __IGCHostControl_FWD_DEFINED__
typedef interface IGCHostControl IGCHostControl;
#endif

#ifndef __IDebuggerThreadControl_FWD_DEFINED__
#define __IDebuggerThreadControl_FWD_DEFINED__
typedef interface IDebuggerThreadControl IDebuggerThreadControl;
#endif

#ifndef __ICorConfiguration_FWD_DEFINED__
#define __ICorConfiguration_FWD_DEFINED__
typedef interface ICorConfiguration ICorConfiguration;
#endif

#ifndef __ICLRControl_FWD_DEFINED__
#define __ICLRControl_FWD_DEFINED__
typedef interface ICLRControl ICLRControl;
#endif

#ifndef __IHostControl_FWD_DEFINED__
#define __IHostControl_FWD_DEFINED__
typedef interface IHostControl IHostControl;
#endif

#ifndef __ICorRuntimeHost_FWD_DEFINED__
#define __ICorRuntimeHost_FWD_DEFINED__
typedef interface ICorRuntimeHost ICorRuntimeHost;
#endif

#ifndef __ICLRRuntimeHost_FWD_DEFINED__
#define __ICLRRuntimeHost_FWD_DEFINED__
typedef interface ICLRRuntimeHost ICLRRuntimeHost;
#endif

#ifndef __IManagedObject_FWD_DEFINED__
#define __IManagedObject_FWD_DEFINED__
typedef interface IManagedObject IManagedObject;
#endif

/* Headers for imported files */

#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

/* FIXME: #include <gcghost.h> */
/* FIXME: #include <ivalidator.h> */
HRESULT     WINAPI CorBindToRuntimeHost(LPCWSTR,LPCWSTR,LPCWSTR,VOID*,DWORD,REFCLSID,REFIID,LPVOID*);
void        WINAPI CorExitProcess(int);
HRESULT     WINAPI GetCORSystemDirectory(LPWSTR,DWORD,DWORD*);
HRESULT     WINAPI GetCORVersion(LPWSTR,DWORD,DWORD*);
HRESULT     WINAPI GetRequestedRuntimeInfo(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,LPWSTR,DWORD,DWORD*,LPWSTR,DWORD,DWORD*);
HRESULT     WINAPI LoadLibraryShim(LPCWSTR,LPCWSTR,LPVOID,HMODULE*);
#ifdef WINE_STRICT_PROTOTYPES
typedef HRESULT (__stdcall *FLockClrVersionCallback)(void);
#else
typedef HRESULT (__stdcall *FLockClrVersionCallback)();
#endif
HRESULT     WINAPI LockClrVersion(FLockClrVersionCallback,FLockClrVersionCallback*,FLockClrVersionCallback*);
typedef void *HDOMAINENUM;
typedef enum RUNTIME_INFO_FLAGS {
    RUNTIME_INFO_UPGRADE_VERSION = 0x1,
    RUNTIME_INFO_REQUEST_IA64 = 0x2,
    RUNTIME_INFO_REQUEST_AMD64 = 0x4,
    RUNTIME_INFO_REQUEST_X86 = 0x8,
    RUNTIME_INFO_DONT_RETURN_DIRECTORY = 0x10,
    RUNTIME_INFO_DONT_RETURN_VERSION = 0x20,
    RUNTIME_INFO_DONT_SHOW_ERROR_DIALOG = 0x40
} RUNTIME_INFO_FLAGS;
typedef HRESULT (__stdcall *FExecuteInAppDomainCallback)(void *cookie);
/*****************************************************************************
 * IGCThreadControl interface
 */
#ifndef __IGCThreadControl_INTERFACE_DEFINED__
#define __IGCThreadControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IGCThreadControl, 0xf31d1788, 0xc397, 0x4725, 0x87,0xa5, 0x6a,0xf3,0x47,0x2c,0x27,0x91);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f31d1788-c397-4725-87a5-6af3472c2791")
IGCThreadControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ThreadIsBlockingForSuspension(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SuspensionStarting(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SuspensionEnding(
        DWORD generation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IGCThreadControl, 0xf31d1788, 0xc397, 0x4725, 0x87,0xa5, 0x6a,0xf3,0x47,0x2c,0x27,0x91)
#endif
#else
typedef struct IGCThreadControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IGCThreadControl* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IGCThreadControl* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IGCThreadControl* This);

    /*** IGCThreadControl methods ***/
    HRESULT (STDMETHODCALLTYPE *ThreadIsBlockingForSuspension)(
        IGCThreadControl* This);

    HRESULT (STDMETHODCALLTYPE *SuspensionStarting)(
        IGCThreadControl* This);

    HRESULT (STDMETHODCALLTYPE *SuspensionEnding)(
        IGCThreadControl* This,
        DWORD generation);

    END_INTERFACE
} IGCThreadControlVtbl;
interface IGCThreadControl {
    CONST_VTBL IGCThreadControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IGCThreadControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGCThreadControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGCThreadControl_Release(This) (This)->lpVtbl->Release(This)
/*** IGCThreadControl methods ***/
#define IGCThreadControl_ThreadIsBlockingForSuspension(This) (This)->lpVtbl->ThreadIsBlockingForSuspension(This)
#define IGCThreadControl_SuspensionStarting(This) (This)->lpVtbl->SuspensionStarting(This)
#define IGCThreadControl_SuspensionEnding(This,generation) (This)->lpVtbl->SuspensionEnding(This,generation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IGCThreadControl_QueryInterface(IGCThreadControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IGCThreadControl_AddRef(IGCThreadControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IGCThreadControl_Release(IGCThreadControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IGCThreadControl methods ***/
static FORCEINLINE HRESULT IGCThreadControl_ThreadIsBlockingForSuspension(IGCThreadControl* This) {
    return This->lpVtbl->ThreadIsBlockingForSuspension(This);
}
static FORCEINLINE HRESULT IGCThreadControl_SuspensionStarting(IGCThreadControl* This) {
    return This->lpVtbl->SuspensionStarting(This);
}
static FORCEINLINE HRESULT IGCThreadControl_SuspensionEnding(IGCThreadControl* This,DWORD generation) {
    return This->lpVtbl->SuspensionEnding(This,generation);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IGCThreadControl_ThreadIsBlockingForSuspension_Proxy(
    IGCThreadControl* This);
void __RPC_STUB IGCThreadControl_ThreadIsBlockingForSuspension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IGCThreadControl_SuspensionStarting_Proxy(
    IGCThreadControl* This);
void __RPC_STUB IGCThreadControl_SuspensionStarting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IGCThreadControl_SuspensionEnding_Proxy(
    IGCThreadControl* This,
    DWORD generation);
void __RPC_STUB IGCThreadControl_SuspensionEnding_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IGCThreadControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IGCHostControl interface
 */
#ifndef __IGCHostControl_INTERFACE_DEFINED__
#define __IGCHostControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IGCHostControl, 0x5513d564, 0x8374, 0x4cb9, 0xae,0xd9, 0x00,0x83,0xf4,0x16,0x0a,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5513d564-8374-4cb9-aed9-0083f4160a1d")
IGCHostControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RequestVirtualMemLimit(
        SIZE_T nMaxVirtualMemMB,
        SIZE_T *nNewMaxVirtualMemMB) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IGCHostControl, 0x5513d564, 0x8374, 0x4cb9, 0xae,0xd9, 0x00,0x83,0xf4,0x16,0x0a,0x1d)
#endif
#else
typedef struct IGCHostControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IGCHostControl* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IGCHostControl* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IGCHostControl* This);

    /*** IGCHostControl methods ***/
    HRESULT (STDMETHODCALLTYPE *RequestVirtualMemLimit)(
        IGCHostControl* This,
        SIZE_T nMaxVirtualMemMB,
        SIZE_T *nNewMaxVirtualMemMB);

    END_INTERFACE
} IGCHostControlVtbl;
interface IGCHostControl {
    CONST_VTBL IGCHostControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IGCHostControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGCHostControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGCHostControl_Release(This) (This)->lpVtbl->Release(This)
/*** IGCHostControl methods ***/
#define IGCHostControl_RequestVirtualMemLimit(This,nMaxVirtualMemMB,nNewMaxVirtualMemMB) (This)->lpVtbl->RequestVirtualMemLimit(This,nMaxVirtualMemMB,nNewMaxVirtualMemMB)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IGCHostControl_QueryInterface(IGCHostControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IGCHostControl_AddRef(IGCHostControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IGCHostControl_Release(IGCHostControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IGCHostControl methods ***/
static FORCEINLINE HRESULT IGCHostControl_RequestVirtualMemLimit(IGCHostControl* This,SIZE_T nMaxVirtualMemMB,SIZE_T *nNewMaxVirtualMemMB) {
    return This->lpVtbl->RequestVirtualMemLimit(This,nMaxVirtualMemMB,nNewMaxVirtualMemMB);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IGCHostControl_RequestVirtualMemLimit_Proxy(
    IGCHostControl* This,
    SIZE_T nMaxVirtualMemMB,
    SIZE_T *nNewMaxVirtualMemMB);
void __RPC_STUB IGCHostControl_RequestVirtualMemLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IGCHostControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDebuggerThreadControl interface
 */
#ifndef __IDebuggerThreadControl_INTERFACE_DEFINED__
#define __IDebuggerThreadControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebuggerThreadControl, 0x23d86786, 0x0bb5, 0x4774, 0x8f,0xb5, 0xe3,0x52,0x2a,0xdd,0x62,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("23d86786-0bb5-4774-8fb5-e3522add6246")
IDebuggerThreadControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ThreadIsBlockingForDebugger(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseAllRuntimeThreads(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartBlockingForDebugger(
        DWORD dwUnused) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebuggerThreadControl, 0x23d86786, 0x0bb5, 0x4774, 0x8f,0xb5, 0xe3,0x52,0x2a,0xdd,0x62,0x46)
#endif
#else
typedef struct IDebuggerThreadControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDebuggerThreadControl* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDebuggerThreadControl* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDebuggerThreadControl* This);

    /*** IDebuggerThreadControl methods ***/
    HRESULT (STDMETHODCALLTYPE *ThreadIsBlockingForDebugger)(
        IDebuggerThreadControl* This);

    HRESULT (STDMETHODCALLTYPE *ReleaseAllRuntimeThreads)(
        IDebuggerThreadControl* This);

    HRESULT (STDMETHODCALLTYPE *StartBlockingForDebugger)(
        IDebuggerThreadControl* This,
        DWORD dwUnused);

    END_INTERFACE
} IDebuggerThreadControlVtbl;
interface IDebuggerThreadControl {
    CONST_VTBL IDebuggerThreadControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebuggerThreadControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebuggerThreadControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebuggerThreadControl_Release(This) (This)->lpVtbl->Release(This)
/*** IDebuggerThreadControl methods ***/
#define IDebuggerThreadControl_ThreadIsBlockingForDebugger(This) (This)->lpVtbl->ThreadIsBlockingForDebugger(This)
#define IDebuggerThreadControl_ReleaseAllRuntimeThreads(This) (This)->lpVtbl->ReleaseAllRuntimeThreads(This)
#define IDebuggerThreadControl_StartBlockingForDebugger(This,dwUnused) (This)->lpVtbl->StartBlockingForDebugger(This,dwUnused)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebuggerThreadControl_QueryInterface(IDebuggerThreadControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebuggerThreadControl_AddRef(IDebuggerThreadControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebuggerThreadControl_Release(IDebuggerThreadControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebuggerThreadControl methods ***/
static FORCEINLINE HRESULT IDebuggerThreadControl_ThreadIsBlockingForDebugger(IDebuggerThreadControl* This) {
    return This->lpVtbl->ThreadIsBlockingForDebugger(This);
}
static FORCEINLINE HRESULT IDebuggerThreadControl_ReleaseAllRuntimeThreads(IDebuggerThreadControl* This) {
    return This->lpVtbl->ReleaseAllRuntimeThreads(This);
}
static FORCEINLINE HRESULT IDebuggerThreadControl_StartBlockingForDebugger(IDebuggerThreadControl* This,DWORD dwUnused) {
    return This->lpVtbl->StartBlockingForDebugger(This,dwUnused);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDebuggerThreadControl_ThreadIsBlockingForDebugger_Proxy(
    IDebuggerThreadControl* This);
void __RPC_STUB IDebuggerThreadControl_ThreadIsBlockingForDebugger_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebuggerThreadControl_ReleaseAllRuntimeThreads_Proxy(
    IDebuggerThreadControl* This);
void __RPC_STUB IDebuggerThreadControl_ReleaseAllRuntimeThreads_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDebuggerThreadControl_StartBlockingForDebugger_Proxy(
    IDebuggerThreadControl* This,
    DWORD dwUnused);
void __RPC_STUB IDebuggerThreadControl_StartBlockingForDebugger_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDebuggerThreadControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICorConfiguration interface
 */
#ifndef __ICorConfiguration_INTERFACE_DEFINED__
#define __ICorConfiguration_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICorConfiguration, 0x5c2b07a5, 0x1e98, 0x11d3, 0x87,0x2f, 0x00,0xc0,0x4f,0x79,0xed,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5c2b07a5-1e98-11d3-872f-00c04f79ed0d")
ICorConfiguration : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetGCThreadControl(
        IGCThreadControl *GCThreadControl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGCHostControl(
        IGCHostControl *GCHostControl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDebuggerThreadControl(
        IDebuggerThreadControl *debuggerThreadControl) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDebuggerSpecialThread(
        DWORD specialThreadId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICorConfiguration, 0x5c2b07a5, 0x1e98, 0x11d3, 0x87,0x2f, 0x00,0xc0,0x4f,0x79,0xed,0x0d)
#endif
#else
typedef struct ICorConfigurationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICorConfiguration* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICorConfiguration* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICorConfiguration* This);

    /*** ICorConfiguration methods ***/
    HRESULT (STDMETHODCALLTYPE *SetGCThreadControl)(
        ICorConfiguration* This,
        IGCThreadControl *GCThreadControl);

    HRESULT (STDMETHODCALLTYPE *SetGCHostControl)(
        ICorConfiguration* This,
        IGCHostControl *GCHostControl);

    HRESULT (STDMETHODCALLTYPE *SetDebuggerThreadControl)(
        ICorConfiguration* This,
        IDebuggerThreadControl *debuggerThreadControl);

    HRESULT (STDMETHODCALLTYPE *AddDebuggerSpecialThread)(
        ICorConfiguration* This,
        DWORD specialThreadId);

    END_INTERFACE
} ICorConfigurationVtbl;
interface ICorConfiguration {
    CONST_VTBL ICorConfigurationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICorConfiguration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICorConfiguration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICorConfiguration_Release(This) (This)->lpVtbl->Release(This)
/*** ICorConfiguration methods ***/
#define ICorConfiguration_SetGCThreadControl(This,GCThreadControl) (This)->lpVtbl->SetGCThreadControl(This,GCThreadControl)
#define ICorConfiguration_SetGCHostControl(This,GCHostControl) (This)->lpVtbl->SetGCHostControl(This,GCHostControl)
#define ICorConfiguration_SetDebuggerThreadControl(This,debuggerThreadControl) (This)->lpVtbl->SetDebuggerThreadControl(This,debuggerThreadControl)
#define ICorConfiguration_AddDebuggerSpecialThread(This,specialThreadId) (This)->lpVtbl->AddDebuggerSpecialThread(This,specialThreadId)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICorConfiguration_QueryInterface(ICorConfiguration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICorConfiguration_AddRef(ICorConfiguration* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICorConfiguration_Release(ICorConfiguration* This) {
    return This->lpVtbl->Release(This);
}
/*** ICorConfiguration methods ***/
static FORCEINLINE HRESULT ICorConfiguration_SetGCThreadControl(ICorConfiguration* This,IGCThreadControl *GCThreadControl) {
    return This->lpVtbl->SetGCThreadControl(This,GCThreadControl);
}
static FORCEINLINE HRESULT ICorConfiguration_SetGCHostControl(ICorConfiguration* This,IGCHostControl *GCHostControl) {
    return This->lpVtbl->SetGCHostControl(This,GCHostControl);
}
static FORCEINLINE HRESULT ICorConfiguration_SetDebuggerThreadControl(ICorConfiguration* This,IDebuggerThreadControl *debuggerThreadControl) {
    return This->lpVtbl->SetDebuggerThreadControl(This,debuggerThreadControl);
}
static FORCEINLINE HRESULT ICorConfiguration_AddDebuggerSpecialThread(ICorConfiguration* This,DWORD specialThreadId) {
    return This->lpVtbl->AddDebuggerSpecialThread(This,specialThreadId);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICorConfiguration_SetGCThreadControl_Proxy(
    ICorConfiguration* This,
    IGCThreadControl *GCThreadControl);
void __RPC_STUB ICorConfiguration_SetGCThreadControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorConfiguration_SetGCHostControl_Proxy(
    ICorConfiguration* This,
    IGCHostControl *GCHostControl);
void __RPC_STUB ICorConfiguration_SetGCHostControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorConfiguration_SetDebuggerThreadControl_Proxy(
    ICorConfiguration* This,
    IDebuggerThreadControl *debuggerThreadControl);
void __RPC_STUB ICorConfiguration_SetDebuggerThreadControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorConfiguration_AddDebuggerSpecialThread_Proxy(
    ICorConfiguration* This,
    DWORD specialThreadId);
void __RPC_STUB ICorConfiguration_AddDebuggerSpecialThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICorConfiguration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICLRControl interface
 */
#ifndef __ICLRControl_INTERFACE_DEFINED__
#define __ICLRControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICLRControl, 0x9065597e, 0xd1a1, 0x4fb2, 0xb6,0xba, 0x7e,0x1f,0xce,0x23,0x0f,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9065597e-d1a1-4fb2-b6ba-7e1fce230f61")
ICLRControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCLRManager(
        REFIID riid,
        void **ppObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAppDomainManagerType(
        LPCWSTR appDomainManagerAssembly,
        LPCWSTR appDomainManagerType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICLRControl, 0x9065597e, 0xd1a1, 0x4fb2, 0xb6,0xba, 0x7e,0x1f,0xce,0x23,0x0f,0x61)
#endif
#else
typedef struct ICLRControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICLRControl* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICLRControl* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICLRControl* This);

    /*** ICLRControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCLRManager)(
        ICLRControl* This,
        REFIID riid,
        void **ppObject);

    HRESULT (STDMETHODCALLTYPE *SetAppDomainManagerType)(
        ICLRControl* This,
        LPCWSTR appDomainManagerAssembly,
        LPCWSTR appDomainManagerType);

    END_INTERFACE
} ICLRControlVtbl;
interface ICLRControl {
    CONST_VTBL ICLRControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICLRControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICLRControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICLRControl_Release(This) (This)->lpVtbl->Release(This)
/*** ICLRControl methods ***/
#define ICLRControl_GetCLRManager(This,riid,ppObject) (This)->lpVtbl->GetCLRManager(This,riid,ppObject)
#define ICLRControl_SetAppDomainManagerType(This,appDomainManagerAssembly,appDomainManagerType) (This)->lpVtbl->SetAppDomainManagerType(This,appDomainManagerAssembly,appDomainManagerType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICLRControl_QueryInterface(ICLRControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICLRControl_AddRef(ICLRControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICLRControl_Release(ICLRControl* This) {
    return This->lpVtbl->Release(This);
}
/*** ICLRControl methods ***/
static FORCEINLINE HRESULT ICLRControl_GetCLRManager(ICLRControl* This,REFIID riid,void **ppObject) {
    return This->lpVtbl->GetCLRManager(This,riid,ppObject);
}
static FORCEINLINE HRESULT ICLRControl_SetAppDomainManagerType(ICLRControl* This,LPCWSTR appDomainManagerAssembly,LPCWSTR appDomainManagerType) {
    return This->lpVtbl->SetAppDomainManagerType(This,appDomainManagerAssembly,appDomainManagerType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICLRControl_GetCLRManager_Proxy(
    ICLRControl* This,
    REFIID riid,
    void **ppObject);
void __RPC_STUB ICLRControl_GetCLRManager_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRControl_SetAppDomainManagerType_Proxy(
    ICLRControl* This,
    LPCWSTR appDomainManagerAssembly,
    LPCWSTR appDomainManagerType);
void __RPC_STUB ICLRControl_SetAppDomainManagerType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICLRControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHostControl interface
 */
#ifndef __IHostControl_INTERFACE_DEFINED__
#define __IHostControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHostControl, 0x02ca073c, 0x7079, 0x4860, 0x88,0x0a, 0xc2,0xf7,0xa4,0x49,0xc9,0x91);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("02ca073c-7079-4860-880a-c2f7a449c991")
IHostControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetHostManager(
        REFIID riid,
        void **ppObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAppDomainManager(
        DWORD appDomainID,
        IUnknown *appDomainManager) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHostControl, 0x02ca073c, 0x7079, 0x4860, 0x88,0x0a, 0xc2,0xf7,0xa4,0x49,0xc9,0x91)
#endif
#else
typedef struct IHostControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHostControl* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHostControl* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHostControl* This);

    /*** IHostControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetHostManager)(
        IHostControl* This,
        REFIID riid,
        void **ppObject);

    HRESULT (STDMETHODCALLTYPE *SetAppDomainManager)(
        IHostControl* This,
        DWORD appDomainID,
        IUnknown *appDomainManager);

    END_INTERFACE
} IHostControlVtbl;
interface IHostControl {
    CONST_VTBL IHostControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHostControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHostControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHostControl_Release(This) (This)->lpVtbl->Release(This)
/*** IHostControl methods ***/
#define IHostControl_GetHostManager(This,riid,ppObject) (This)->lpVtbl->GetHostManager(This,riid,ppObject)
#define IHostControl_SetAppDomainManager(This,appDomainID,appDomainManager) (This)->lpVtbl->SetAppDomainManager(This,appDomainID,appDomainManager)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHostControl_QueryInterface(IHostControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHostControl_AddRef(IHostControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHostControl_Release(IHostControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IHostControl methods ***/
static FORCEINLINE HRESULT IHostControl_GetHostManager(IHostControl* This,REFIID riid,void **ppObject) {
    return This->lpVtbl->GetHostManager(This,riid,ppObject);
}
static FORCEINLINE HRESULT IHostControl_SetAppDomainManager(IHostControl* This,DWORD appDomainID,IUnknown *appDomainManager) {
    return This->lpVtbl->SetAppDomainManager(This,appDomainID,appDomainManager);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IHostControl_GetHostManager_Proxy(
    IHostControl* This,
    REFIID riid,
    void **ppObject);
void __RPC_STUB IHostControl_GetHostManager_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IHostControl_SetAppDomainManager_Proxy(
    IHostControl* This,
    DWORD appDomainID,
    IUnknown *appDomainManager);
void __RPC_STUB IHostControl_SetAppDomainManager_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IHostControl_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_CorRuntimeHost, 0xcb2f6723,0xab3a,0x11d2,0x9c,0x40,0x00,0xc0,0x4f,0xa3,0x0a,0x3e);
/*****************************************************************************
 * ICorRuntimeHost interface
 */
#ifndef __ICorRuntimeHost_INTERFACE_DEFINED__
#define __ICorRuntimeHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICorRuntimeHost, 0xcb2f6722, 0xab3a, 0x11d2, 0x9c,0x40, 0x00,0xc0,0x4f,0xa3,0x0a,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cb2f6722-ab3a-11d2-9c40-00c04fa30a3e")
ICorRuntimeHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateLogicalThreadState(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteLogicalThreadState(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SwitchInLogicalThreadState(
        DWORD *fiberCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SwitchOutLogicalThreadState(
        DWORD **fiberCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE LocksHeldByLogicalThread(
        DWORD *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE MapFile(
        HANDLE hFile,
        HMODULE *mapAddress) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConfiguration(
        ICorConfiguration **pConfiguration) = 0;

    virtual HRESULT STDMETHODCALLTYPE Start(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDomain(
        LPCWSTR friendlyName,
        IUnknown *identityArray,
        IUnknown **appDomain) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultDomain(
        IUnknown **pAppDomain) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumDomains(
        HDOMAINENUM *hEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE NextDomain(
        HDOMAINENUM hEnum,
        IUnknown **appDomain) = 0;

    virtual HRESULT STDMETHODCALLTYPE CloseEnum(
        HDOMAINENUM hEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDomainEx(
        LPCWSTR friendlyName,
        IUnknown *setup,
        IUnknown *evidence,
        IUnknown **appDomain) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDomainSetup(
        IUnknown **appDomainSetup) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateEvidence(
        IUnknown **evidence) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnloadDomain(
        IUnknown *appDomain) = 0;

    virtual HRESULT STDMETHODCALLTYPE CurrentDomain(
        IUnknown **appDomain) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICorRuntimeHost, 0xcb2f6722, 0xab3a, 0x11d2, 0x9c,0x40, 0x00,0xc0,0x4f,0xa3,0x0a,0x3e)
#endif
#else
typedef struct ICorRuntimeHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICorRuntimeHost* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICorRuntimeHost* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICorRuntimeHost* This);

    /*** ICorRuntimeHost methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLogicalThreadState)(
        ICorRuntimeHost* This);

    HRESULT (STDMETHODCALLTYPE *DeleteLogicalThreadState)(
        ICorRuntimeHost* This);

    HRESULT (STDMETHODCALLTYPE *SwitchInLogicalThreadState)(
        ICorRuntimeHost* This,
        DWORD *fiberCookie);

    HRESULT (STDMETHODCALLTYPE *SwitchOutLogicalThreadState)(
        ICorRuntimeHost* This,
        DWORD **fiberCookie);

    HRESULT (STDMETHODCALLTYPE *LocksHeldByLogicalThread)(
        ICorRuntimeHost* This,
        DWORD *pCount);

    HRESULT (STDMETHODCALLTYPE *MapFile)(
        ICorRuntimeHost* This,
        HANDLE hFile,
        HMODULE *mapAddress);

    HRESULT (STDMETHODCALLTYPE *GetConfiguration)(
        ICorRuntimeHost* This,
        ICorConfiguration **pConfiguration);

    HRESULT (STDMETHODCALLTYPE *Start)(
        ICorRuntimeHost* This);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        ICorRuntimeHost* This);

    HRESULT (STDMETHODCALLTYPE *CreateDomain)(
        ICorRuntimeHost* This,
        LPCWSTR friendlyName,
        IUnknown *identityArray,
        IUnknown **appDomain);

    HRESULT (STDMETHODCALLTYPE *GetDefaultDomain)(
        ICorRuntimeHost* This,
        IUnknown **pAppDomain);

    HRESULT (STDMETHODCALLTYPE *EnumDomains)(
        ICorRuntimeHost* This,
        HDOMAINENUM *hEnum);

    HRESULT (STDMETHODCALLTYPE *NextDomain)(
        ICorRuntimeHost* This,
        HDOMAINENUM hEnum,
        IUnknown **appDomain);

    HRESULT (STDMETHODCALLTYPE *CloseEnum)(
        ICorRuntimeHost* This,
        HDOMAINENUM hEnum);

    HRESULT (STDMETHODCALLTYPE *CreateDomainEx)(
        ICorRuntimeHost* This,
        LPCWSTR friendlyName,
        IUnknown *setup,
        IUnknown *evidence,
        IUnknown **appDomain);

    HRESULT (STDMETHODCALLTYPE *CreateDomainSetup)(
        ICorRuntimeHost* This,
        IUnknown **appDomainSetup);

    HRESULT (STDMETHODCALLTYPE *CreateEvidence)(
        ICorRuntimeHost* This,
        IUnknown **evidence);

    HRESULT (STDMETHODCALLTYPE *UnloadDomain)(
        ICorRuntimeHost* This,
        IUnknown *appDomain);

    HRESULT (STDMETHODCALLTYPE *CurrentDomain)(
        ICorRuntimeHost* This,
        IUnknown **appDomain);

    END_INTERFACE
} ICorRuntimeHostVtbl;
interface ICorRuntimeHost {
    CONST_VTBL ICorRuntimeHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICorRuntimeHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICorRuntimeHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICorRuntimeHost_Release(This) (This)->lpVtbl->Release(This)
/*** ICorRuntimeHost methods ***/
#define ICorRuntimeHost_CreateLogicalThreadState(This) (This)->lpVtbl->CreateLogicalThreadState(This)
#define ICorRuntimeHost_DeleteLogicalThreadState(This) (This)->lpVtbl->DeleteLogicalThreadState(This)
#define ICorRuntimeHost_SwitchInLogicalThreadState(This,fiberCookie) (This)->lpVtbl->SwitchInLogicalThreadState(This,fiberCookie)
#define ICorRuntimeHost_SwitchOutLogicalThreadState(This,fiberCookie) (This)->lpVtbl->SwitchOutLogicalThreadState(This,fiberCookie)
#define ICorRuntimeHost_LocksHeldByLogicalThread(This,pCount) (This)->lpVtbl->LocksHeldByLogicalThread(This,pCount)
#define ICorRuntimeHost_MapFile(This,hFile,mapAddress) (This)->lpVtbl->MapFile(This,hFile,mapAddress)
#define ICorRuntimeHost_GetConfiguration(This,pConfiguration) (This)->lpVtbl->GetConfiguration(This,pConfiguration)
#define ICorRuntimeHost_Start(This) (This)->lpVtbl->Start(This)
#define ICorRuntimeHost_Stop(This) (This)->lpVtbl->Stop(This)
#define ICorRuntimeHost_CreateDomain(This,friendlyName,identityArray,appDomain) (This)->lpVtbl->CreateDomain(This,friendlyName,identityArray,appDomain)
#define ICorRuntimeHost_GetDefaultDomain(This,pAppDomain) (This)->lpVtbl->GetDefaultDomain(This,pAppDomain)
#define ICorRuntimeHost_EnumDomains(This,hEnum) (This)->lpVtbl->EnumDomains(This,hEnum)
#define ICorRuntimeHost_NextDomain(This,hEnum,appDomain) (This)->lpVtbl->NextDomain(This,hEnum,appDomain)
#define ICorRuntimeHost_CloseEnum(This,hEnum) (This)->lpVtbl->CloseEnum(This,hEnum)
#define ICorRuntimeHost_CreateDomainEx(This,friendlyName,setup,evidence,appDomain) (This)->lpVtbl->CreateDomainEx(This,friendlyName,setup,evidence,appDomain)
#define ICorRuntimeHost_CreateDomainSetup(This,appDomainSetup) (This)->lpVtbl->CreateDomainSetup(This,appDomainSetup)
#define ICorRuntimeHost_CreateEvidence(This,evidence) (This)->lpVtbl->CreateEvidence(This,evidence)
#define ICorRuntimeHost_UnloadDomain(This,appDomain) (This)->lpVtbl->UnloadDomain(This,appDomain)
#define ICorRuntimeHost_CurrentDomain(This,appDomain) (This)->lpVtbl->CurrentDomain(This,appDomain)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICorRuntimeHost_QueryInterface(ICorRuntimeHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICorRuntimeHost_AddRef(ICorRuntimeHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICorRuntimeHost_Release(ICorRuntimeHost* This) {
    return This->lpVtbl->Release(This);
}
/*** ICorRuntimeHost methods ***/
static FORCEINLINE HRESULT ICorRuntimeHost_CreateLogicalThreadState(ICorRuntimeHost* This) {
    return This->lpVtbl->CreateLogicalThreadState(This);
}
static FORCEINLINE HRESULT ICorRuntimeHost_DeleteLogicalThreadState(ICorRuntimeHost* This) {
    return This->lpVtbl->DeleteLogicalThreadState(This);
}
static FORCEINLINE HRESULT ICorRuntimeHost_SwitchInLogicalThreadState(ICorRuntimeHost* This,DWORD *fiberCookie) {
    return This->lpVtbl->SwitchInLogicalThreadState(This,fiberCookie);
}
static FORCEINLINE HRESULT ICorRuntimeHost_SwitchOutLogicalThreadState(ICorRuntimeHost* This,DWORD **fiberCookie) {
    return This->lpVtbl->SwitchOutLogicalThreadState(This,fiberCookie);
}
static FORCEINLINE HRESULT ICorRuntimeHost_LocksHeldByLogicalThread(ICorRuntimeHost* This,DWORD *pCount) {
    return This->lpVtbl->LocksHeldByLogicalThread(This,pCount);
}
static FORCEINLINE HRESULT ICorRuntimeHost_MapFile(ICorRuntimeHost* This,HANDLE hFile,HMODULE *mapAddress) {
    return This->lpVtbl->MapFile(This,hFile,mapAddress);
}
static FORCEINLINE HRESULT ICorRuntimeHost_GetConfiguration(ICorRuntimeHost* This,ICorConfiguration **pConfiguration) {
    return This->lpVtbl->GetConfiguration(This,pConfiguration);
}
static FORCEINLINE HRESULT ICorRuntimeHost_Start(ICorRuntimeHost* This) {
    return This->lpVtbl->Start(This);
}
static FORCEINLINE HRESULT ICorRuntimeHost_Stop(ICorRuntimeHost* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT ICorRuntimeHost_CreateDomain(ICorRuntimeHost* This,LPCWSTR friendlyName,IUnknown *identityArray,IUnknown **appDomain) {
    return This->lpVtbl->CreateDomain(This,friendlyName,identityArray,appDomain);
}
static FORCEINLINE HRESULT ICorRuntimeHost_GetDefaultDomain(ICorRuntimeHost* This,IUnknown **pAppDomain) {
    return This->lpVtbl->GetDefaultDomain(This,pAppDomain);
}
static FORCEINLINE HRESULT ICorRuntimeHost_EnumDomains(ICorRuntimeHost* This,HDOMAINENUM *hEnum) {
    return This->lpVtbl->EnumDomains(This,hEnum);
}
static FORCEINLINE HRESULT ICorRuntimeHost_NextDomain(ICorRuntimeHost* This,HDOMAINENUM hEnum,IUnknown **appDomain) {
    return This->lpVtbl->NextDomain(This,hEnum,appDomain);
}
static FORCEINLINE HRESULT ICorRuntimeHost_CloseEnum(ICorRuntimeHost* This,HDOMAINENUM hEnum) {
    return This->lpVtbl->CloseEnum(This,hEnum);
}
static FORCEINLINE HRESULT ICorRuntimeHost_CreateDomainEx(ICorRuntimeHost* This,LPCWSTR friendlyName,IUnknown *setup,IUnknown *evidence,IUnknown **appDomain) {
    return This->lpVtbl->CreateDomainEx(This,friendlyName,setup,evidence,appDomain);
}
static FORCEINLINE HRESULT ICorRuntimeHost_CreateDomainSetup(ICorRuntimeHost* This,IUnknown **appDomainSetup) {
    return This->lpVtbl->CreateDomainSetup(This,appDomainSetup);
}
static FORCEINLINE HRESULT ICorRuntimeHost_CreateEvidence(ICorRuntimeHost* This,IUnknown **evidence) {
    return This->lpVtbl->CreateEvidence(This,evidence);
}
static FORCEINLINE HRESULT ICorRuntimeHost_UnloadDomain(ICorRuntimeHost* This,IUnknown *appDomain) {
    return This->lpVtbl->UnloadDomain(This,appDomain);
}
static FORCEINLINE HRESULT ICorRuntimeHost_CurrentDomain(ICorRuntimeHost* This,IUnknown **appDomain) {
    return This->lpVtbl->CurrentDomain(This,appDomain);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICorRuntimeHost_CreateLogicalThreadState_Proxy(
    ICorRuntimeHost* This);
void __RPC_STUB ICorRuntimeHost_CreateLogicalThreadState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_DeleteLogicalThreadState_Proxy(
    ICorRuntimeHost* This);
void __RPC_STUB ICorRuntimeHost_DeleteLogicalThreadState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_SwitchInLogicalThreadState_Proxy(
    ICorRuntimeHost* This,
    DWORD *fiberCookie);
void __RPC_STUB ICorRuntimeHost_SwitchInLogicalThreadState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_SwitchOutLogicalThreadState_Proxy(
    ICorRuntimeHost* This,
    DWORD **fiberCookie);
void __RPC_STUB ICorRuntimeHost_SwitchOutLogicalThreadState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_LocksHeldByLogicalThread_Proxy(
    ICorRuntimeHost* This,
    DWORD *pCount);
void __RPC_STUB ICorRuntimeHost_LocksHeldByLogicalThread_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_MapFile_Proxy(
    ICorRuntimeHost* This,
    HANDLE hFile,
    HMODULE *mapAddress);
void __RPC_STUB ICorRuntimeHost_MapFile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_GetConfiguration_Proxy(
    ICorRuntimeHost* This,
    ICorConfiguration **pConfiguration);
void __RPC_STUB ICorRuntimeHost_GetConfiguration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_Start_Proxy(
    ICorRuntimeHost* This);
void __RPC_STUB ICorRuntimeHost_Start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_Stop_Proxy(
    ICorRuntimeHost* This);
void __RPC_STUB ICorRuntimeHost_Stop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_CreateDomain_Proxy(
    ICorRuntimeHost* This,
    LPCWSTR friendlyName,
    IUnknown *identityArray,
    IUnknown **appDomain);
void __RPC_STUB ICorRuntimeHost_CreateDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_GetDefaultDomain_Proxy(
    ICorRuntimeHost* This,
    IUnknown **pAppDomain);
void __RPC_STUB ICorRuntimeHost_GetDefaultDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_EnumDomains_Proxy(
    ICorRuntimeHost* This,
    HDOMAINENUM *hEnum);
void __RPC_STUB ICorRuntimeHost_EnumDomains_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_NextDomain_Proxy(
    ICorRuntimeHost* This,
    HDOMAINENUM hEnum,
    IUnknown **appDomain);
void __RPC_STUB ICorRuntimeHost_NextDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_CloseEnum_Proxy(
    ICorRuntimeHost* This,
    HDOMAINENUM hEnum);
void __RPC_STUB ICorRuntimeHost_CloseEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_CreateDomainEx_Proxy(
    ICorRuntimeHost* This,
    LPCWSTR friendlyName,
    IUnknown *setup,
    IUnknown *evidence,
    IUnknown **appDomain);
void __RPC_STUB ICorRuntimeHost_CreateDomainEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_CreateDomainSetup_Proxy(
    ICorRuntimeHost* This,
    IUnknown **appDomainSetup);
void __RPC_STUB ICorRuntimeHost_CreateDomainSetup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_CreateEvidence_Proxy(
    ICorRuntimeHost* This,
    IUnknown **evidence);
void __RPC_STUB ICorRuntimeHost_CreateEvidence_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_UnloadDomain_Proxy(
    ICorRuntimeHost* This,
    IUnknown *appDomain);
void __RPC_STUB ICorRuntimeHost_UnloadDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICorRuntimeHost_CurrentDomain_Proxy(
    ICorRuntimeHost* This,
    IUnknown **appDomain);
void __RPC_STUB ICorRuntimeHost_CurrentDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICorRuntimeHost_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_CLRRuntimeHost, 0x90f1a06e,0x7712,0x4762,0x86,0xb5,0x7a,0x5e,0xba,0x6b,0xdb,0x02);
/*****************************************************************************
 * ICLRRuntimeHost interface
 */
#ifndef __ICLRRuntimeHost_INTERFACE_DEFINED__
#define __ICLRRuntimeHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICLRRuntimeHost, 0x90f1a06c, 0x7712, 0x4762, 0x86,0xb5, 0x7a,0x5e,0xba,0x6b,0xdb,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("90f1a06c-7712-4762-86b5-7a5eba6bdb02")
ICLRRuntimeHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Start(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHostControl(
        IHostControl *pHostControl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCLRControl(
        ICLRControl **pCLRControl) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnloadAppDomain(
        DWORD dwAppDomainId,
        WINBOOL fWaitUntilDone) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecuteInAppDomain(
        DWORD dwAppDomainId,
        HRESULT (__stdcall * pCallback)(void *cookie),
        void *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAppDomainId(
        DWORD *pdwAppDomainId) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecuteApplication(
        LPCWSTR pwzAppFullName,
        DWORD dwManifestPaths,
        LPCWSTR *ppwzManifestPaths,
        DWORD dwActivationData,
        LPCWSTR *ppwzActivationData,
        int *pReturnValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecuteInDefaultAppDomain(
        LPCWSTR pwzAssemblyPath,
        LPCWSTR pwzTypeName,
        LPCWSTR pwzMethodName,
        LPCWSTR pwzArgument,
        DWORD *pReturnValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICLRRuntimeHost, 0x90f1a06c, 0x7712, 0x4762, 0x86,0xb5, 0x7a,0x5e,0xba,0x6b,0xdb,0x02)
#endif
#else
typedef struct ICLRRuntimeHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICLRRuntimeHost* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICLRRuntimeHost* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICLRRuntimeHost* This);

    /*** ICLRRuntimeHost methods ***/
    HRESULT (STDMETHODCALLTYPE *Start)(
        ICLRRuntimeHost* This);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        ICLRRuntimeHost* This);

    HRESULT (STDMETHODCALLTYPE *SetHostControl)(
        ICLRRuntimeHost* This,
        IHostControl *pHostControl);

    HRESULT (STDMETHODCALLTYPE *GetCLRControl)(
        ICLRRuntimeHost* This,
        ICLRControl **pCLRControl);

    HRESULT (STDMETHODCALLTYPE *UnloadAppDomain)(
        ICLRRuntimeHost* This,
        DWORD dwAppDomainId,
        WINBOOL fWaitUntilDone);

    HRESULT (STDMETHODCALLTYPE *ExecuteInAppDomain)(
        ICLRRuntimeHost* This,
        DWORD dwAppDomainId,
        HRESULT (__stdcall * pCallback)(void *cookie),
        void *cookie);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAppDomainId)(
        ICLRRuntimeHost* This,
        DWORD *pdwAppDomainId);

    HRESULT (STDMETHODCALLTYPE *ExecuteApplication)(
        ICLRRuntimeHost* This,
        LPCWSTR pwzAppFullName,
        DWORD dwManifestPaths,
        LPCWSTR *ppwzManifestPaths,
        DWORD dwActivationData,
        LPCWSTR *ppwzActivationData,
        int *pReturnValue);

    HRESULT (STDMETHODCALLTYPE *ExecuteInDefaultAppDomain)(
        ICLRRuntimeHost* This,
        LPCWSTR pwzAssemblyPath,
        LPCWSTR pwzTypeName,
        LPCWSTR pwzMethodName,
        LPCWSTR pwzArgument,
        DWORD *pReturnValue);

    END_INTERFACE
} ICLRRuntimeHostVtbl;
interface ICLRRuntimeHost {
    CONST_VTBL ICLRRuntimeHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICLRRuntimeHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICLRRuntimeHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICLRRuntimeHost_Release(This) (This)->lpVtbl->Release(This)
/*** ICLRRuntimeHost methods ***/
#define ICLRRuntimeHost_Start(This) (This)->lpVtbl->Start(This)
#define ICLRRuntimeHost_Stop(This) (This)->lpVtbl->Stop(This)
#define ICLRRuntimeHost_SetHostControl(This,pHostControl) (This)->lpVtbl->SetHostControl(This,pHostControl)
#define ICLRRuntimeHost_GetCLRControl(This,pCLRControl) (This)->lpVtbl->GetCLRControl(This,pCLRControl)
#define ICLRRuntimeHost_UnloadAppDomain(This,dwAppDomainId,fWaitUntilDone) (This)->lpVtbl->UnloadAppDomain(This,dwAppDomainId,fWaitUntilDone)
#define ICLRRuntimeHost_ExecuteInAppDomain(This,dwAppDomainId,pCallback,cookie) (This)->lpVtbl->ExecuteInAppDomain(This,dwAppDomainId,pCallback,cookie)
#define ICLRRuntimeHost_GetCurrentAppDomainId(This,pdwAppDomainId) (This)->lpVtbl->GetCurrentAppDomainId(This,pdwAppDomainId)
#define ICLRRuntimeHost_ExecuteApplication(This,pwzAppFullName,dwManifestPaths,ppwzManifestPaths,dwActivationData,ppwzActivationData,pReturnValue) (This)->lpVtbl->ExecuteApplication(This,pwzAppFullName,dwManifestPaths,ppwzManifestPaths,dwActivationData,ppwzActivationData,pReturnValue)
#define ICLRRuntimeHost_ExecuteInDefaultAppDomain(This,pwzAssemblyPath,pwzTypeName,pwzMethodName,pwzArgument,pReturnValue) (This)->lpVtbl->ExecuteInDefaultAppDomain(This,pwzAssemblyPath,pwzTypeName,pwzMethodName,pwzArgument,pReturnValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICLRRuntimeHost_QueryInterface(ICLRRuntimeHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICLRRuntimeHost_AddRef(ICLRRuntimeHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICLRRuntimeHost_Release(ICLRRuntimeHost* This) {
    return This->lpVtbl->Release(This);
}
/*** ICLRRuntimeHost methods ***/
static FORCEINLINE HRESULT ICLRRuntimeHost_Start(ICLRRuntimeHost* This) {
    return This->lpVtbl->Start(This);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_Stop(ICLRRuntimeHost* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_SetHostControl(ICLRRuntimeHost* This,IHostControl *pHostControl) {
    return This->lpVtbl->SetHostControl(This,pHostControl);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_GetCLRControl(ICLRRuntimeHost* This,ICLRControl **pCLRControl) {
    return This->lpVtbl->GetCLRControl(This,pCLRControl);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_UnloadAppDomain(ICLRRuntimeHost* This,DWORD dwAppDomainId,WINBOOL fWaitUntilDone) {
    return This->lpVtbl->UnloadAppDomain(This,dwAppDomainId,fWaitUntilDone);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_ExecuteInAppDomain(ICLRRuntimeHost* This,DWORD dwAppDomainId,HRESULT (__stdcall * pCallback)(void *cookie),void *cookie) {
    return This->lpVtbl->ExecuteInAppDomain(This,dwAppDomainId,pCallback,cookie);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_GetCurrentAppDomainId(ICLRRuntimeHost* This,DWORD *pdwAppDomainId) {
    return This->lpVtbl->GetCurrentAppDomainId(This,pdwAppDomainId);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_ExecuteApplication(ICLRRuntimeHost* This,LPCWSTR pwzAppFullName,DWORD dwManifestPaths,LPCWSTR *ppwzManifestPaths,DWORD dwActivationData,LPCWSTR *ppwzActivationData,int *pReturnValue) {
    return This->lpVtbl->ExecuteApplication(This,pwzAppFullName,dwManifestPaths,ppwzManifestPaths,dwActivationData,ppwzActivationData,pReturnValue);
}
static FORCEINLINE HRESULT ICLRRuntimeHost_ExecuteInDefaultAppDomain(ICLRRuntimeHost* This,LPCWSTR pwzAssemblyPath,LPCWSTR pwzTypeName,LPCWSTR pwzMethodName,LPCWSTR pwzArgument,DWORD *pReturnValue) {
    return This->lpVtbl->ExecuteInDefaultAppDomain(This,pwzAssemblyPath,pwzTypeName,pwzMethodName,pwzArgument,pReturnValue);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_Start_Proxy(
    ICLRRuntimeHost* This);
void __RPC_STUB ICLRRuntimeHost_Start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_Stop_Proxy(
    ICLRRuntimeHost* This);
void __RPC_STUB ICLRRuntimeHost_Stop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_SetHostControl_Proxy(
    ICLRRuntimeHost* This,
    IHostControl *pHostControl);
void __RPC_STUB ICLRRuntimeHost_SetHostControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_GetCLRControl_Proxy(
    ICLRRuntimeHost* This,
    ICLRControl **pCLRControl);
void __RPC_STUB ICLRRuntimeHost_GetCLRControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_UnloadAppDomain_Proxy(
    ICLRRuntimeHost* This,
    DWORD dwAppDomainId,
    WINBOOL fWaitUntilDone);
void __RPC_STUB ICLRRuntimeHost_UnloadAppDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_ExecuteInAppDomain_Proxy(
    ICLRRuntimeHost* This,
    DWORD dwAppDomainId,
    HRESULT (__stdcall * pCallback)(void *cookie),
    void *cookie);
void __RPC_STUB ICLRRuntimeHost_ExecuteInAppDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_GetCurrentAppDomainId_Proxy(
    ICLRRuntimeHost* This,
    DWORD *pdwAppDomainId);
void __RPC_STUB ICLRRuntimeHost_GetCurrentAppDomainId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_ExecuteApplication_Proxy(
    ICLRRuntimeHost* This,
    LPCWSTR pwzAppFullName,
    DWORD dwManifestPaths,
    LPCWSTR *ppwzManifestPaths,
    DWORD dwActivationData,
    LPCWSTR *ppwzActivationData,
    int *pReturnValue);
void __RPC_STUB ICLRRuntimeHost_ExecuteApplication_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ICLRRuntimeHost_ExecuteInDefaultAppDomain_Proxy(
    ICLRRuntimeHost* This,
    LPCWSTR pwzAssemblyPath,
    LPCWSTR pwzTypeName,
    LPCWSTR pwzMethodName,
    LPCWSTR pwzArgument,
    DWORD *pReturnValue);
void __RPC_STUB ICLRRuntimeHost_ExecuteInDefaultAppDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICLRRuntimeHost_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IManagedObject interface
 */
#ifndef __IManagedObject_INTERFACE_DEFINED__
#define __IManagedObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IManagedObject, 0xc3fcc19e, 0xa970, 0x11d2, 0x8b,0x5a, 0x00,0xa0,0xc9,0xb7,0xc9,0xc4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c3fcc19e-a970-11d2-8b5a-00a0c9b7c9c4")
IManagedObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSerializedBuffer(
        BSTR *pBSTR) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjectIdentity(
        BSTR *pBSTRGUID,
        int *AppDomainID,
        int *pCCW) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IManagedObject, 0xc3fcc19e, 0xa970, 0x11d2, 0x8b,0x5a, 0x00,0xa0,0xc9,0xb7,0xc9,0xc4)
#endif
#else
typedef struct IManagedObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IManagedObject* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IManagedObject* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IManagedObject* This);

    /*** IManagedObject methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSerializedBuffer)(
        IManagedObject* This,
        BSTR *pBSTR);

    HRESULT (STDMETHODCALLTYPE *GetObjectIdentity)(
        IManagedObject* This,
        BSTR *pBSTRGUID,
        int *AppDomainID,
        int *pCCW);

    END_INTERFACE
} IManagedObjectVtbl;
interface IManagedObject {
    CONST_VTBL IManagedObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IManagedObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IManagedObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IManagedObject_Release(This) (This)->lpVtbl->Release(This)
/*** IManagedObject methods ***/
#define IManagedObject_GetSerializedBuffer(This,pBSTR) (This)->lpVtbl->GetSerializedBuffer(This,pBSTR)
#define IManagedObject_GetObjectIdentity(This,pBSTRGUID,AppDomainID,pCCW) (This)->lpVtbl->GetObjectIdentity(This,pBSTRGUID,AppDomainID,pCCW)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IManagedObject_QueryInterface(IManagedObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IManagedObject_AddRef(IManagedObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IManagedObject_Release(IManagedObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IManagedObject methods ***/
static FORCEINLINE HRESULT IManagedObject_GetSerializedBuffer(IManagedObject* This,BSTR *pBSTR) {
    return This->lpVtbl->GetSerializedBuffer(This,pBSTR);
}
static FORCEINLINE HRESULT IManagedObject_GetObjectIdentity(IManagedObject* This,BSTR *pBSTRGUID,int *AppDomainID,int *pCCW) {
    return This->lpVtbl->GetObjectIdentity(This,pBSTRGUID,AppDomainID,pCCW);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IManagedObject_GetSerializedBuffer_Proxy(
    IManagedObject* This,
    BSTR *pBSTR);
void __RPC_STUB IManagedObject_GetSerializedBuffer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IManagedObject_GetObjectIdentity_Proxy(
    IManagedObject* This,
    BSTR *pBSTRGUID,
    int *AppDomainID,
    int *pCCW);
void __RPC_STUB IManagedObject_GetObjectIdentity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IManagedObject_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __mscoree_h__ */
