From 8acb502d3285340a1f2f33e71eedce173e58a221 Mon Sep 17 00:00:00 2001 From: Andreia Gaita Date: Tue, 9 Aug 2016 17:19:08 +0200 Subject: [PATCH] Make sure the assembly resolver is always loaded Fixes #484 --- src/GitHub.Exports/GitHub.Exports.csproj | 1 + .../Helpers/AssemblyResolver.cs | 73 +++++++++++++++++++ .../Helpers/SharedDictionaryManager.cs | 6 ++ src/GitHub.VisualStudio/GitHubPackage.cs | 59 +-------------- .../Helpers/SharedDictionaryManager.cs | 5 +- 5 files changed, 85 insertions(+), 59 deletions(-) create mode 100644 src/GitHub.Exports/Helpers/AssemblyResolver.cs diff --git a/src/GitHub.Exports/GitHub.Exports.csproj b/src/GitHub.Exports/GitHub.Exports.csproj index ed40a1461e..0c5c674ca3 100644 --- a/src/GitHub.Exports/GitHub.Exports.csproj +++ b/src/GitHub.Exports/GitHub.Exports.csproj @@ -100,6 +100,7 @@ + diff --git a/src/GitHub.Exports/Helpers/AssemblyResolver.cs b/src/GitHub.Exports/Helpers/AssemblyResolver.cs new file mode 100644 index 0000000000..dca412f0a9 --- /dev/null +++ b/src/GitHub.Exports/Helpers/AssemblyResolver.cs @@ -0,0 +1,73 @@ +using GitHub.VisualStudio; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace GitHub.Helpers +{ + public static class AssemblyResolver + { + static bool resolverInitialized; + + // list of assemblies to be loaded from the extension installation path + static readonly string[] ourAssemblies = + { + "GitHub.Api", + "GitHub.App", + "GitHub.CredentialManagement", + "GitHub.Exports", + "GitHub.Exports.Reactive", + "GitHub.Extensions", + "GitHub.Extensions.Reactive", + "GitHub.UI", + "GitHub.UI.Reactive", + "GitHub.VisualStudio", + "GitHub.TeamFoundation", + "GitHub.TeamFoundation.14", + "GitHub.TeamFoundation.15", + "GitHub.VisualStudio.UI", + "System.Windows.Interactivity" + }; + + public static void InitializeAssemblyResolver() + { + if (resolverInitialized) + return; + AppDomain.CurrentDomain.AssemblyResolve += LoadAssemblyFromRunDir; + resolverInitialized = true; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Reliability", "CA2001:AvoidCallingProblematicMethods")] + static Assembly LoadAssemblyFromRunDir(object sender, ResolveEventArgs e) + { + try + { + var name = new AssemblyName(e.Name); + if (!ourAssemblies.Contains(name.Name)) + return null; + var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + var filename = Path.Combine(path, name.Name + ".dll"); + if (!File.Exists(filename)) + return null; + return Assembly.LoadFrom(filename); + } + catch (Exception ex) + { + var log = string.Format(CultureInfo.CurrentCulture, + "Error occurred loading {0} from {1}.{2}{3}{4}", + e.Name, + Assembly.GetExecutingAssembly().Location, + Environment.NewLine, + ex, + Environment.NewLine); + VsOutputLogger.Write(log); + } + return null; + } + } +} diff --git a/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs b/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs index fa73ac11e9..e60377d247 100644 --- a/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs +++ b/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs @@ -3,11 +3,17 @@ using System.Windows; using Microsoft.VisualStudio.PlatformUI; using GitHub.VisualStudio.Helpers; +using GitHub.Helpers; namespace GitHub.VisualStudio.UI.Helpers { public class SharedDictionaryManager : ResourceDictionary { + static SharedDictionaryManager() + { + AssemblyResolver.InitializeAssemblyResolver(); + } + public SharedDictionaryManager() { currentTheme = Colors.DetectTheme(); diff --git a/src/GitHub.VisualStudio/GitHubPackage.cs b/src/GitHub.VisualStudio/GitHubPackage.cs index 4a4c72dc75..a41fe5b5c3 100644 --- a/src/GitHub.VisualStudio/GitHubPackage.cs +++ b/src/GitHub.VisualStudio/GitHubPackage.cs @@ -17,6 +17,7 @@ using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; using Octokit; +using GitHub.Helpers; namespace GitHub.VisualStudio { @@ -32,32 +33,12 @@ namespace GitHub.VisualStudio [ProvideOptionPage(typeof(OptionsPage), "GitHub for Visual Studio", "General", 0, 0, supportsAutomation: true)] public class GitHubPackage : Package { - // list of assemblies to be loaded from the extension installation path - static readonly string[] ourAssemblies = - { - "GitHub.Api", - "GitHub.App", - "GitHub.CredentialManagement", - "GitHub.Exports", - "GitHub.Exports.Reactive", - "GitHub.Extensions", - "GitHub.Extensions.Reactive", - "GitHub.UI", - "GitHub.UI.Reactive", - "GitHub.VisualStudio", - "GitHub.TeamFoundation", - "GitHub.TeamFoundation.14", - "GitHub.TeamFoundation.15", - "GitHub.VisualStudio.UI", - "System.Windows.Interactivity" - }; readonly IServiceProvider serviceProvider; - static bool resolverInitialized; static GitHubPackage() { - InitializeAssemblyResolver(); + AssemblyResolver.InitializeAssemblyResolver(); } public GitHubPackage() @@ -70,14 +51,6 @@ public GitHubPackage(IServiceProvider serviceProvider) this.serviceProvider = serviceProvider; } - public static void InitializeAssemblyResolver() - { - if (resolverInitialized) - return; - AppDomain.CurrentDomain.AssemblyResolve += LoadAssemblyFromRunDir; - resolverInitialized = true; - } - protected override void Initialize() { base.Initialize(); @@ -91,34 +64,6 @@ protected override void Initialize() serviceProvider.AddCommandHandler(menu.Guid, menu.CmdId, menu.CanShow, () => menu.Activate()); } - [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Reliability", "CA2001:AvoidCallingProblematicMethods")] - static Assembly LoadAssemblyFromRunDir(object sender, ResolveEventArgs e) - { - try - { - var name = new AssemblyName(e.Name); - if (!ourAssemblies.Contains(name.Name)) - return null; - var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - var filename = Path.Combine(path, name.Name + ".dll"); - if (!File.Exists(filename)) - return null; - return Assembly.LoadFrom(filename); - } - catch (Exception ex) - { - var log = string.Format(CultureInfo.CurrentCulture, - "Error occurred loading {0} from {1}.{2}{3}{4}", - e.Name, - Assembly.GetExecutingAssembly().Location, - Environment.NewLine, - ex, - Environment.NewLine); - VsOutputLogger.Write(log); - } - return null; - } - void IncrementLaunchCount() { var usageTracker = serviceProvider.GetExportedValue(); diff --git a/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs b/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs index 40a41467bd..0d621e240a 100644 --- a/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs +++ b/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs @@ -1,4 +1,5 @@ -using System; +using GitHub.Helpers; +using System; using System.Collections.Generic; using System.Windows; @@ -8,7 +9,7 @@ public class SharedDictionaryManager : ResourceDictionary { static SharedDictionaryManager() { - GitHubPackage.InitializeAssemblyResolver(); + AssemblyResolver.InitializeAssemblyResolver(); } static readonly Dictionary resourceDicts = new Dictionary();