Bootstrap.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Linq;
  3. using System.Reflection;
  4. using System.Collections.Generic;
  5. using System.Runtime.InteropServices;
  6. using System.Runtime.Loader;
  7. namespace Atomic.Bootstrap
  8. {
  9. // This must be in TPA list
  10. public class AtomicLoadContext : LoadContext
  11. {
  12. static List<string> assemblyLoadPaths = new List<string>();
  13. public static void Startup(string _assemblyLoadPaths)
  14. {
  15. LoadContext.InitializeDefaultContext(new AtomicLoadContext());
  16. assemblyLoadPaths = _assemblyLoadPaths.Split(';').ToList();
  17. //Console.WriteLine("Bootstrap Startup paths: {0}", _assemblyLoadPaths);
  18. }
  19. public static void AddAssemblyLoadPath(string path)
  20. {
  21. assemblyLoadPaths.Add(path);
  22. }
  23. [DllImport("kernel32.dll")]
  24. public static extern IntPtr GetModuleHandle(string lpModuleName);
  25. [DllImport("dl")]
  26. protected static extern IntPtr dlopen(string filename, int flags);
  27. protected override IntPtr LoadUnmanagedDll(String unmanagedDllName)
  28. {
  29. /*
  30. if (unmanagedDllName == "__Internal")
  31. {
  32. IntPtr result = GetModuleHandle(null);
  33. return result;
  34. }
  35. // do we need to walk paths here?
  36. Console.WriteLine("LoadUnmanagedDll: " + unmanagedDllName);
  37. return GetModuleHandle(unmanagedDllName); //RTLD_LAZY
  38. */
  39. if (unmanagedDllName == "__Internal")
  40. {
  41. IntPtr result = dlopen(null, 1); //RTLD_LAZY
  42. return result;
  43. }
  44. // do we need to walk paths here?
  45. Console.WriteLine("LoadUnmanagedDll: " + unmanagedDllName);
  46. return dlopen(unmanagedDllName, 1 ); //RTLD_LAZY
  47. }
  48. public override Assembly LoadAssembly(AssemblyName assemblyName)
  49. {
  50. Assembly assembly = null;
  51. foreach (var path in assemblyLoadPaths)
  52. {
  53. try
  54. {
  55. //Console.WriteLine("Assembly Load Attempt: {0}", path + assemblyName.Name + ".dll");
  56. assembly = LoadFromAssemblyPath(path + assemblyName.Name + ".dll");
  57. break;
  58. }
  59. catch //(Exception e)
  60. {
  61. //Console.WriteLine(e.Message);
  62. }
  63. }
  64. return assembly;
  65. }
  66. }
  67. }