private LoaderMessages FillCatalog()
        {
            _compositionContainer.ComposeExportedValue(nameof(VsPackage), (IServiceProvider)this);
            _compositionContainer.ComposeExportedValue(Tracer);

            var assembly = GetType().Assembly;

            var messages = new LoaderMessages();

            //var allLocalAssemblyFileNames = Directory.EnumerateFiles(path, @"*.dll");
            //var allLocalAssemblyNames = new HashSet<string>(allLocalAssemblyFileNames.Select(Path.GetFileNameWithoutExtension));
            //var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();

            //var messages = loadedAssemblies
            //    .Where(a => allLocalAssemblyNames.Contains(a.GetName().Name))
            //    .Where(a => !string.Equals(Path.GetDirectoryName(a.Location), path, StringComparison.OrdinalIgnoreCase))
            //    .OrderBy(a => a.FullName, StringComparer.OrdinalIgnoreCase)
            //    .Select(assembly => string.Format(CultureInfo.CurrentCulture, "Found assembly '{0}' already loaded from {1}.", assembly.FullName, assembly.CodeBase))
            //    .ToList();

#pragma warning disable CA2000 // Dispose objects before losing scope => AggregateCatalog will dispose all
            _compositionCatalog.Catalogs.Add(new AssemblyCatalog(assembly));
            _compositionCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Infrastructure.Properties.AssemblyKey).Assembly));
            _compositionCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Model.Properties.AssemblyKey).Assembly));
            _compositionCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Translators.Properties.AssemblyKey).Assembly));
            _compositionCatalog.Catalogs.Add(new AssemblyCatalog(typeof(View.Properties.AssemblyKey).Assembly));
#pragma warning restore CA2000 // Dispose objects before losing scope

            _exportProviderLoaded.Set();

            return(messages);
        }
Beispiel #2
0
        private LoaderMessages FillCatalog()
        {
            var assembly = GetType().Assembly;
            var messages = new LoaderMessages();

            //var allLocalAssemblyFileNames = Directory.EnumerateFiles(path, @"*.dll");
            //var allLocalAssemblyNames = new HashSet<string>(allLocalAssemblyFileNames.Select(Path.GetFileNameWithoutExtension));
            //var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();

            //var messages = loadedAssemblies
            //    .Where(a => allLocalAssemblyNames.Contains(a.GetName().Name))
            //    .Where(a => !string.Equals(Path.GetDirectoryName(a.Location), path, StringComparison.OrdinalIgnoreCase))
            //    .OrderBy(a => a.FullName, StringComparer.OrdinalIgnoreCase)
            //    .Select(assembly => string.Format(CultureInfo.CurrentCulture, "Found assembly '{0}' already loaded from {1}.", assembly.FullName, assembly.CodeBase))
            //    .ToList();

            _kernel.BindExports(assembly,
                                typeof(Infrastructure.Properties.AssemblyKey).Assembly,
                                typeof(Model.Properties.AssemblyKey).Assembly,
                                typeof(Translators.Properties.AssemblyKey).Assembly,
                                typeof(View.Properties.AssemblyKey).Assembly);

            _kernel.Bind <IExportProvider>().ToConstant(ExportProvider);

            return(messages);
        }
        private LoaderMessages FillCatalog()
        {
            var compositionContainer = _compositionHost.Container;

            compositionContainer.ComposeExportedValue(nameof(VSPackage), (IServiceProvider)this);
            compositionContainer.ComposeExportedValue(Tracer);

            var thisAssembly = GetType().Assembly;

            var path = Path.GetDirectoryName(thisAssembly.Location);

            var messages = new LoaderMessages();

            //var allLocalAssemblyFileNames = Directory.EnumerateFiles(path, @"*.dll");
            //var allLocalAssemblyNames = new HashSet<string>(allLocalAssemblyFileNames.Select(Path.GetFileNameWithoutExtension));
            //var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();

            //var messages = loadedAssemblies
            //    .Where(a => allLocalAssemblyNames.Contains(a.GetName().Name))
            //    .Where(a => !string.Equals(Path.GetDirectoryName(a.Location), path, StringComparison.OrdinalIgnoreCase))
            //    .OrderBy(a => a.FullName, StringComparer.OrdinalIgnoreCase)
            //    .Select(assembly => string.Format(CultureInfo.CurrentCulture, "Found assembly '{0}' already loaded from {1}.", assembly.FullName, assembly.CodeBase))
            //    .ToList();

            foreach (var file in Directory.EnumerateFiles(path, @"*.dll"))
            {
                try
                {
                    var assembly = Assembly.LoadFrom(file);
                    messages.Messages.Add(string.Format(CultureInfo.CurrentCulture, "Loaded assembly '{0}' from {1}.", assembly.FullName, assembly.CodeBase));
                    _compositionHost.AddCatalog(new AssemblyCatalog(assembly));
                }
                catch (ReflectionTypeLoadException ex)
                {
                    // ReSharper disable once AssignNullToNotNullAttribute
                    // ReSharper disable once PossibleNullReferenceException
                    messages.Errors.Add("Assembly: " + Path.GetFileName(file) + " => " + string.Join("\n", ex.LoaderExceptions.Select(l => l.Message + ": " + (l.InnerException?.Message ?? string.Empty))));
                }
                catch (Exception ex)
                {
                    messages.Errors.Add("Assembly: " + Path.GetFileName(file) + " => " + ex.Message);
                }
            }

            _compositionHostLoaded.Set();

            return(messages);
        }
Beispiel #4
0
        private LoaderMessages FillCatalog()
        {
            var assembly = GetType().Assembly;
            var messages = new LoaderMessages();

            //var allLocalAssemblyFileNames = Directory.EnumerateFiles(path, @"*.dll");
            //var allLocalAssemblyNames = new HashSet<string>(allLocalAssemblyFileNames.Select(Path.GetFileNameWithoutExtension));
            //var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();

            //var messages = loadedAssemblies
            //    .Where(a => allLocalAssemblyNames.Contains(a.GetName().Name))
            //    .Where(a => !string.Equals(Path.GetDirectoryName(a.Location), path, StringComparison.OrdinalIgnoreCase))
            //    .OrderBy(a => a.FullName, StringComparer.OrdinalIgnoreCase)
            //    .Select(assembly => string.Format(CultureInfo.CurrentCulture, "Found assembly '{0}' already loaded from {1}.", assembly.FullName, assembly.CodeBase))
            //    .ToList();

            var is64BitProcess = Environment.Is64BitProcess;

            using var resourceStream = is64BitProcess
                ? Resource.AsStream("ResXManager.VSIX.Compatibility.x64.dll")
                : Resource.AsStream("ResXManager.VSIX.Compatibility.x86.dll");

            var length = resourceStream.Length;
            var data   = new byte[length];

            resourceStream.Read(data, 0, (int)length);

            var compatibilityLayer = System.Reflection.Assembly.Load(data);

            _kernel.BindExports(assembly,
                                typeof(Infrastructure.Properties.AssemblyKey).Assembly,
                                typeof(Model.Properties.AssemblyKey).Assembly,
                                typeof(Translators.Properties.AssemblyKey).Assembly,
                                typeof(View.Properties.AssemblyKey).Assembly,
                                compatibilityLayer);

            _kernel.Bind <IExportProvider>().ToConstant(ExportProvider);

            return(messages);
        }
Beispiel #5
0
        private void ShowLoaderMessages(LoaderMessages messages)
        {
            if (!messages.Errors.Any())
            {
                return;
            }

            try
            {
                foreach (var error in messages.Errors)
                {
                    Tracer.TraceError(error);
                }
                foreach (var message in messages.Messages)
                {
                    Tracer.WriteLine(message);
                }
            }
            catch
            {
                MessageBox.Show("Loader errors:\n" + string.Join("\n", messages.Errors));
            }
        }