public Stage(JProperty stage, ETLProgram program) { ID = stage.Name; JToken stageDesc = stage.Value; Enabled = Convert.ToBoolean(stageDesc["enabled"]); // Установка статусов по умолчанию Status = StageStatus.Successful; ExecStatus = Enabled ? StageExecutionStatus.InQueue : StageExecutionStatus.Skipped; Name = stageDesc["name"].ToString(); // Формирование списка параметров этапа Parameters = FormParamsList(stageDesc["params"]); RootProgram = program; // Привязка метода объекта программы к этапу string functName = stageDesc["func"].ToString(); if (string.IsNullOrEmpty(functName)) { Logger.WriteToTrace("Не задана функция выполнения этапа.", TraceMessageKind.Warning); return; } MethodInfo method = program.GetType().GetMethod(functName); if (method == null) { Logger.WriteToTrace($"Не найдена функция выполнения \"{functName}\" этапа \"{ID}\".", TraceMessageKind.Warning); return; } Method = (StageFunc)method.CreateDelegate(typeof(StageFunc), program); }
private static void Init(decimal sessNo, string id, string moduleName) { Logger.Initialize($"{sessNo}", Path.Combine(context.Settings.Registry.LogsPath, id), true); Logger.WriteToTrace($"Инициализация закачки \"{id}\"...", TraceMessageKind.Information); // Получаем описание закачки и загружаем модуль с кодом string module = Path.Combine(context.Settings.Registry.ModulesPath, moduleName); if (!File.Exists(module)) { throw new Exception($"Не обнаружен программный модуль \"{moduleName}\"."); } Assembly assembly = Assembly.LoadFile(module); Type type = assembly.GetTypes().FirstOrDefault(t => typeof(ETLProgram).IsAssignableFrom(t)); if (type == null) { throw new Exception($"В модуле \"{moduleName}\" отсутствуют типы, реализующие программу закачки."); } program = (ETLProgram)assembly.CreateInstance(type.FullName, false, BindingFlags.CreateInstance, null, null, CultureInfo.CurrentCulture, null); }