/// <summary> /// Get include path for cpp include /// </summary> private string GetIncludePathOfCppInclude(ConfigMapping configurationContext, CppInclude unit) { IncludeMapping includeOfUnit = null; IEnumerable <ConfigMapping> configFilesLoaded = configurationContext.ConfigFilesLoaded; foreach (ConfigMapping configFileLoad in configFilesLoaded) { foreach (IncludeMapping include in configFileLoad.Includes) { if (include.Id == unit.Name) { includeOfUnit = include; break; } } if (includeOfUnit != null) { break; } } return((includeOfUnit != null) ? includeOfUnit.File : "invalid"); }
/// <summary> /// Get file path of cpp include /// </summary> private string GetFilePathOfCppInclude(ConfigMapping configurationContext, CppInclude unit) { ConfigMapping configOfUnit = null; IncludeMapping includeOfUnit = null; IEnumerable <ConfigMapping> configFilesLoaded = configurationContext.ConfigFilesLoaded; foreach (ConfigMapping configFileLoad in configFilesLoaded) { foreach (IncludeMapping include in configFileLoad.Includes) { if (include.Id == unit.Name) { includeOfUnit = include; configOfUnit = configFileLoad; break; } if ((configOfUnit != null) && (includeOfUnit != null)) { break; } } } return((((configOfUnit != null) && (includeOfUnit != null)) ? Path.Combine(Path.GetDirectoryName(configOfUnit.AbsoluteFilePath), (string.IsNullOrEmpty(includeOfUnit.Alias) ? unit.Name : includeOfUnit.Alias.ToLower())) : "invalid") + ".gen"); }
/// <summary> Will be invoked when the app domain cannot resolve an assembly on its own. </summary> private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { string assemblyName = args.Name; string[] nameSplit = assemblyName.Split(','); // Fully qualified name if (nameSplit.Length > 1) { assemblyName = nameSplit[0]; } // Remove trailing '.dll' assemblyName = assemblyName.Replace(".dll", string.Empty); // Maybe the assembly has already been resolved if (_nameToAssemblyMap.TryGetValue(assemblyName, out Assembly assmbly)) { return(assmbly); } Stream assemblyStream; // Maybe it's an included assembly? string dllName = $"{assemblyName}.dll"; IncludeMapping inclMap = _includeMappings.FirstOrDefault(x => x.Name == dllName); if (inclMap != null) { string path = inclMap.BundlePath; IBundle bundle = inclMap.Bundle; assemblyStream = bundle.GetResourceAsStream(path); using (assemblyStream) { return(Unwrap(assemblyStream, assemblyName)); } } // TODO Maybe a hash algorithmn would be faster // Looking for normal plugged assembly using (LinkedList <IPluginInfo> .Enumerator enmtor = _providedPlugins.GetEnumerator()) { while (enmtor.MoveNext()) { IPluginInfo plugin = enmtor.Current; if (plugin == null) { continue; } IBundle bundle = plugin.Bundle; if (bundle.Name != assemblyName) { continue; } string lookupName = $"{assemblyName}.dll"; assemblyStream = bundle.GetResourceAsStream(lookupName); using (assemblyStream) { return(Unwrap(assemblyStream, assemblyName)); } } } return(null); }
/// <summary> Starts the Plug-in Service. </summary> public void Start() { if (_started) { return; } _log.Info("Starting plug-in service"); string currentDirectoryPath = Directory.GetCurrentDirectory(); string pluginDirectoryPath = $"{currentDirectoryPath}{PluginDirectoryPath}"; DirectoryInfo directoryInfo = new DirectoryInfo(pluginDirectoryPath); if (!directoryInfo.Exists) { throw new DirectoryNotFoundException(pluginDirectoryPath); } FileInfo[] marcFiles = directoryInfo.GetFiles("*.marc", SearchOption.TopDirectoryOnly); // Find all available plug-ins for (int i = -1; ++i < marcFiles.Length;) { FileInfo marcFile = marcFiles[i]; IBundle bundle = BundleFactory.Instance.CreateBundle(marcFile); IPluginInfo pluginInfo = RegisterBundle(bundle); if (pluginInfo == null) { continue; } _foundPlugins.AddLast(pluginInfo); // Handling additional resources string[] bundleResources = bundle.GetResources(@"includes/*"); for (int j = -1; ++j != bundleResources.Length;) { string rsx = bundleResources[j]; string[] split = rsx.Split('/'); string name = split.Last(); string bundlePath = rsx; IncludeMapping inclMap = new IncludeMapping { Name = name, BundlePath = bundlePath, Bundle = bundle }; _includeMappings.AddLast(inclMap); } } // Check dependencies using (LinkedList <IPluginInfo> .Enumerator enmtor = _foundPlugins.GetEnumerator()) { while (enmtor.MoveNext()) { IPluginInfo pluginInfo = enmtor.Current; bool dependenciesSatisfied = CheckDependencies(pluginInfo, _foundPlugins, out string missingDependencyName); if (!dependenciesSatisfied) { string message = $"Can not provide '{pluginInfo}' " + $"because of missing dependency '{missingDependencyName}'. " + "Plug-in will not be available!"; _log.Error(message); continue; } SetPluginState(pluginInfo, EPluginState.Provided); _providedPlugins.AddLast(pluginInfo); } } _started = true; _log.Info("Plug-in Service started"); }