/// <summary> /// Register next settings assembly. /// </summary> /// <param name="assemblyIndex"></param> public static void RegisterSettingsAssembly(uint assemblyIndex) { // Locate the settings assembly config. // var assemblyConfigKey = new Core.Internal.RegisteredSettingsAssemblyConfig.CodegenKey { AssemblyIndex = assemblyIndex, }; SharedConfig <MlosProxyInternal.RegisteredSettingsAssemblyConfig> assemblySharedConfig = MlosContext.SharedConfigManager.Lookup(assemblyConfigKey); if (assemblySharedConfig.HasSharedConfig) { MlosProxyInternal.RegisteredSettingsAssemblyConfig assemblyConfig = assemblySharedConfig.Config; // Try to load assembly from the agent folder. // string applicationFolderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string assemblyFilePath = Path.Combine(applicationFolderPath, assemblyConfig.AssemblyFileName.Value); if (!File.Exists(assemblyFilePath)) { // Try to load assembly from the target folder. // applicationFolderPath = Path.GetDirectoryName(assemblyConfig.ApplicationFilePath.Value); assemblyFilePath = Path.Combine(applicationFolderPath, assemblyConfig.AssemblyFileName.Value); } Assembly assembly = Assembly.LoadFrom(assemblyFilePath); RegisterAssembly(assembly, dispatchTableBaseIndex: assemblyConfig.DispatchTableBaseIndex); } }
/// <summary> /// Register next settings assembly. /// </summary> /// <param name="assemblyIndex"></param> public void RegisterSettingsAssembly(uint assemblyIndex) { // Locate the settings assembly config. // var assemblyConfigKey = new Core.Internal.RegisteredSettingsAssemblyConfig.CodegenKey { AssemblyIndex = assemblyIndex, }; SharedConfig <MlosProxyInternal.RegisteredSettingsAssemblyConfig> assemblySharedConfig = MlosContext.SharedConfigManager.Lookup(assemblyConfigKey); if (assemblySharedConfig.HasSharedConfig) { MlosProxyInternal.RegisteredSettingsAssemblyConfig assemblyConfig = assemblySharedConfig.Config; // Start looking for places to find the assembly. // List <string> assemblyDirs = new List <string>(); // 1. Try to load assembly from the agent folder. // assemblyDirs.Add(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); // 2. Try to load assembly from the full path listed in the config. // Note: This doesn't currently work for Linux. // See Also: Mlos.Core/MlosContext.cpp // if (assemblyConfig.ApplicationFilePath.Value != null) { assemblyDirs.Add(Path.GetDirectoryName(assemblyConfig.ApplicationFilePath.Value)); } // 3. The current working directory. // assemblyDirs.Add("."); // 4. The search path specified in an environment variable. // This is akin to an LD_LIBRARY_PATH but specifically for MLOS Settings Registry DLLs. // string settingsRegistryLibraryPath = System.Environment.GetEnvironmentVariable("MLOS_SETTINGS_REGISTRY_PATH"); if (!string.IsNullOrEmpty(settingsRegistryLibraryPath)) { if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { assemblyDirs.AddRange(settingsRegistryLibraryPath.Split(';')); } else if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { assemblyDirs.AddRange(settingsRegistryLibraryPath.Split(':')); } else { throw new NotImplementedException( string.Format("Unhandled OS: '{0}'", System.Runtime.InteropServices.RuntimeInformation.OSDescription ?? "Unknown")); } } // Now, return the first full path to the assembly that we find. // string assemblyFilePath = null; string assemblyFileName = assemblyConfig.AssemblyFileName.Value; foreach (string assemblyDir in assemblyDirs) { ////Console.WriteLine(string.Format("Checking for settings registry assembly {0} in {1}", assemblyFileName, assemblyDir)); string tmpAssemblyFilePath = Path.Combine(assemblyDir, assemblyFileName); if (File.Exists(tmpAssemblyFilePath)) { assemblyFilePath = tmpAssemblyFilePath; Console.WriteLine(string.Format("Found settings registry assembly at {0}", assemblyFilePath)); break; } } if (assemblyFilePath == null) { throw new FileNotFoundException(string.Format("Failed to find settings registry assembly '{0}'", assemblyFileName)); } Assembly assembly = Assembly.LoadFrom(assemblyFilePath); RegisterAssembly(assembly, dispatchTableBaseIndex: assemblyConfig.DispatchTableBaseIndex); } }