private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) { Assembly ret; String my_name = args.Name; int pos = my_name.IndexOf(","); if (pos != -1) { my_name = my_name.Substring(0, pos); } instances = get_domain_hashtable(); ret = (Assembly)instances [my_name]; if (ret == null) { try { #if MONO ret = LoadAssemblyFromVirtuoso(my_name); instances [my_name] = ret; #else int currp = GetModuleHandle(null); int proc_addr = GetProcAddress(currp, "dotnet_unmanaged_call"); IntPtr str1 = Marshal.StringToCoTaskMemAnsi(my_name); byte_size_ptr_t arg = new byte_size_ptr_t(); arg.size = 0; arg.data = IntPtr.Zero; arg.name = str1; int thr_id = CreateThread(0, 0, proc_addr, ref arg, 0, 0); WaitForSingleObject(thr_id, INFINITE); CloseHandle(thr_id); Marshal.FreeCoTaskMem(str1); if (arg.size > 0 && arg.data != IntPtr.Zero) { byte [] bytes = new byte[arg.size]; Marshal.Copy(arg.data, bytes, 0, arg.size); Marshal.FreeCoTaskMem(arg.data); arg.data = IntPtr.Zero; ret = Assembly.Load(bytes); instances [my_name] = ret; } else { return(null); } #endif } catch { return(null); } } return(ret); }
private static extern int CreateThread(int SecurityAttributes, System.UInt32 stack_size, int start_routine, ref byte_size_ptr_t my_data, UInt32 flags, int thr_id);
private static extern int CreateThread (int SecurityAttributes, System.UInt32 stack_size, int start_routine, ref byte_size_ptr_t my_data, UInt32 flags, int thr_id);
private Assembly MyResolveEventHandler (object sender, ResolveEventArgs args) { Assembly ret; String my_name = args.Name; int pos = my_name.IndexOf (","); if (pos != -1) my_name = my_name.Substring (0, pos); instances = get_domain_hashtable (); ret = (Assembly) instances [my_name]; if (ret == null) { try { #if MONO ret = LoadAssemblyFromVirtuoso (my_name); instances [my_name] = ret; #else int currp = GetModuleHandle (null); int proc_addr = GetProcAddress (currp, "dotnet_unmanaged_call"); IntPtr str1 = Marshal.StringToCoTaskMemAnsi (my_name); byte_size_ptr_t arg = new byte_size_ptr_t (); arg.size = 0; arg.data = IntPtr.Zero; arg.name = str1; int thr_id = CreateThread (0, 0, proc_addr, ref arg, 0, 0); WaitForSingleObject (thr_id, INFINITE); CloseHandle (thr_id); Marshal.FreeCoTaskMem (str1); if (arg.size > 0 && arg.data != IntPtr.Zero) { byte [] bytes = new byte[arg.size]; Marshal.Copy (arg.data, bytes, 0, arg.size); Marshal.FreeCoTaskMem (arg.data); arg.data = IntPtr.Zero; ret = Assembly.Load (bytes); instances [my_name] = ret; } else return null; #endif } catch { return null; } } return ret; }