[2/3] mscoree: Use the main HMODULE in _CorExeMain instead of loading a new exe.

Vincent Povirk madewokherd at gmail.com
Wed May 2 16:16:58 CDT 2012


-------------- next part --------------
From 4f4fda3d1ec04993b642573173d8d9dd837ceabe Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Wed, 2 May 2012 13:04:36 -0500
Subject: [PATCH 2/7] mscoree: Use the main HMODULE in _CorExeMain instead of
 loading a new exe.

---
 dlls/mscoree/corruntimehost.c  |   20 +++++++++++++++++---
 dlls/mscoree/metahost.c        |    2 ++
 dlls/mscoree/mscoree_private.h |    2 ++
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c
index 31c02ea..35815f0 100644
--- a/dlls/mscoree/corruntimehost.c
+++ b/dlls/mscoree/corruntimehost.c
@@ -829,7 +829,9 @@ __int32 WINAPI _CorExeMain(void)
     int argc;
     char **argv;
     MonoDomain *domain;
-    MonoAssembly *assembly;
+    MonoImage *image;
+    MonoImageOpenStatus status;
+    MonoAssembly *assembly=NULL;
     WCHAR filename[MAX_PATH];
     char *filenameA;
     ICLRRuntimeInfo *info;
@@ -863,9 +865,21 @@ __int32 WINAPI _CorExeMain(void)
 
         if (SUCCEEDED(hr))
         {
-            assembly = host->mono->mono_domain_assembly_open(domain, filenameA);
+            image = host->mono->mono_image_open_from_module_handle(GetModuleHandleW(NULL),
+                filenameA, 1, &status);
 
-            exit_code = host->mono->mono_jit_exec(domain, assembly, argc, argv);
+            if (image)
+                assembly = host->mono->mono_assembly_load_from(image, filenameA, &status);
+
+            if (assembly)
+            {
+                exit_code = host->mono->mono_jit_exec(domain, assembly, argc, argv);
+            }
+            else
+            {
+                ERR("couldn't load %s, status=%d\n", debugstr_w(filename), status);
+                exit_code = -1;
+            }
 
             RuntimeHost_DeleteDomain(host, domain);
         }
diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c
index 1296e37..2c3322a 100644
--- a/dlls/mscoree/metahost.c
+++ b/dlls/mscoree/metahost.c
@@ -165,12 +165,14 @@ static HRESULT load_mono(CLRRuntimeInfo *This, loaded_mono **result)
 } while (0);
 
         LOAD_MONO_FUNCTION(mono_assembly_get_image);
+        LOAD_MONO_FUNCTION(mono_assembly_load_from);
         LOAD_MONO_FUNCTION(mono_assembly_open);
         LOAD_MONO_FUNCTION(mono_config_parse);
         LOAD_MONO_FUNCTION(mono_class_from_mono_type);
         LOAD_MONO_FUNCTION(mono_class_from_name);
         LOAD_MONO_FUNCTION(mono_class_get_method_from_name);
         LOAD_MONO_FUNCTION(mono_domain_assembly_open);
+        LOAD_MONO_FUNCTION(mono_image_open_from_module_handle);
         LOAD_MONO_FUNCTION(mono_install_assembly_preload_hook);
         LOAD_MONO_FUNCTION(mono_jit_exec);
         LOAD_MONO_FUNCTION(mono_jit_init);
diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h
index 12a1e56..357914f 100644
--- a/dlls/mscoree/mscoree_private.h
+++ b/dlls/mscoree/mscoree_private.h
@@ -147,6 +147,7 @@ struct loaded_mono
     BOOL is_shutdown;
 
     MonoImage* (CDECL *mono_assembly_get_image)(MonoAssembly *assembly);
+    MonoAssembly* (CDECL *mono_assembly_load_from)(MonoImage *image, const char *fname, MonoImageOpenStatus *status);
     MonoAssembly* (CDECL *mono_assembly_open)(const char *filename, MonoImageOpenStatus *status);
     MonoClass* (CDECL *mono_class_from_mono_type)(MonoType *type);
     MonoClass* (CDECL *mono_class_from_name)(MonoImage *image, const char* name_space, const char *name);
@@ -154,6 +155,7 @@ struct loaded_mono
     void (CDECL *mono_config_parse)(const char *filename);
     MonoAssembly* (CDECL *mono_domain_assembly_open) (MonoDomain *domain, const char *name);
     void (CDECL *mono_free)(void *);
+    MonoImage* (CDECL *mono_image_open_from_module_handle)(HMODULE module_handle, char* fname, UINT has_entry_point, MonoImageOpenStatus* status);
     void (CDECL *mono_install_assembly_preload_hook)(MonoAssemblyPreLoadFunc func, void *user_data);
     int (CDECL *mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]);
     MonoDomain* (CDECL *mono_jit_init)(const char *file);
-- 
1.7.9.5


More information about the wine-patches mailing list