From 77d96a2760c74ee21fc7e0a8f9c457843f2ddd60 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Tue, 3 Aug 2010 15:16:13 -0500 Subject: [PATCH 1/3] mscoree: Store the AppDomain from CorExeMain, for use in other functions. --- dlls/mscoree/mscoree_main.c | 43 +++++++++++++++++++++++++++++++++++++------ 1 files changed, 37 insertions(+), 6 deletions(-) diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c index 1269f9c..c363271 100644 --- a/dlls/mscoree/mscoree_main.c +++ b/dlls/mscoree/mscoree_main.c @@ -114,6 +114,8 @@ static CRITICAL_SECTION mono_lib_cs = { &mono_lib_cs_debug, -1, 0, 0, 0, 0 }; HMODULE mono_handle; +MonoDomain *default_domain; + void (*mono_config_parse)(const char *filename); MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name); void (*mono_jit_cleanup)(MonoDomain *domain); @@ -214,6 +216,22 @@ end: return result; } +static void unload_mono(void) +{ + EnterCriticalSection(&mono_lib_cs); + if (default_domain) + { + mono_jit_cleanup(default_domain); + default_domain = NULL; + } + if (mono_handle) + { + FreeLibrary(mono_handle); + mono_handle = NULL; + } + LeaveCriticalSection(&mono_lib_cs); +} + HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, LPCWSTR pwszHostConfigFile, VOID *pReserved, DWORD startupFlags, REFCLSID rclsid, @@ -300,7 +318,6 @@ __int32 WINAPI _CorExeMain(void) char trace_setting[256]; int argc; char **argv; - MonoDomain *domain; MonoAssembly *assembly; char filename[MAX_PATH]; @@ -320,13 +337,24 @@ __int32 WINAPI _CorExeMain(void) GetModuleFileNameA(NULL, filename, MAX_PATH); - domain = mono_jit_init(filename); + if (!default_domain) + { + EnterCriticalSection(&mono_lib_cs); + if (!mono_handle) + { + ERR("CorExitProcess called on another thread?\n"); + return -1; + } + else if (!default_domain) + default_domain = mono_jit_init(filename); + LeaveCriticalSection(&mono_lib_cs); + } - assembly = mono_domain_assembly_open(domain, filename); + assembly = mono_domain_assembly_open(default_domain, filename); - exit_code = mono_jit_exec(domain, assembly, argc, argv); + exit_code = mono_jit_exec(default_domain, assembly, argc, argv); - mono_jit_cleanup(domain); + unload_mono(); HeapFree(GetProcessHeap(), 0, argv); @@ -342,7 +370,10 @@ __int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName, void WINAPI CorExitProcess(int exitCode) { - FIXME("(%x) stub\n", exitCode); + TRACE("(%x)\n", exitCode); + + unload_mono(); + ExitProcess(exitCode); } -- 1.7.0.4