コード例 #1
0
        /// <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");
        }
コード例 #2
0
        /// <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");
        }
コード例 #3
0
ファイル: PluginService.cs プロジェクト: astorch/motoi
        /// <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);
        }
コード例 #4
0
ファイル: PluginService.cs プロジェクト: astorch/motoi
        /// <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");
        }