Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 115ff59

Browse files
authored
Merge pull request #488 from github/fixes/484-composition-failed
Make sure the assembly resolver is always loaded
2 parents a190026 + 8acb502 commit 115ff59

File tree

5 files changed

+85
-59
lines changed

5 files changed

+85
-59
lines changed

src/GitHub.Exports/GitHub.Exports.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
<Compile Include="Factories\IUIFactory.cs" />
101101
<Compile Include="Factories\IUIPair.cs" />
102102
<Compile Include="GlobalSuppressions.cs" />
103+
<Compile Include="Helpers\AssemblyResolver.cs" />
103104
<Compile Include="Helpers\INotifyPropertySource.cs" />
104105
<Compile Include="Extensions\PropertyNotifierExtensions.cs" />
105106
<Compile Include="Extensions\SimpleRepositoryModelExtensions.cs" />
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using GitHub.VisualStudio;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Globalization;
5+
using System.IO;
6+
using System.Linq;
7+
using System.Reflection;
8+
using System.Text;
9+
using System.Threading.Tasks;
10+
11+
namespace GitHub.Helpers
12+
{
13+
public static class AssemblyResolver
14+
{
15+
static bool resolverInitialized;
16+
17+
// list of assemblies to be loaded from the extension installation path
18+
static readonly string[] ourAssemblies =
19+
{
20+
"GitHub.Api",
21+
"GitHub.App",
22+
"GitHub.CredentialManagement",
23+
"GitHub.Exports",
24+
"GitHub.Exports.Reactive",
25+
"GitHub.Extensions",
26+
"GitHub.Extensions.Reactive",
27+
"GitHub.UI",
28+
"GitHub.UI.Reactive",
29+
"GitHub.VisualStudio",
30+
"GitHub.TeamFoundation",
31+
"GitHub.TeamFoundation.14",
32+
"GitHub.TeamFoundation.15",
33+
"GitHub.VisualStudio.UI",
34+
"System.Windows.Interactivity"
35+
};
36+
37+
public static void InitializeAssemblyResolver()
38+
{
39+
if (resolverInitialized)
40+
return;
41+
AppDomain.CurrentDomain.AssemblyResolve += LoadAssemblyFromRunDir;
42+
resolverInitialized = true;
43+
}
44+
45+
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Reliability", "CA2001:AvoidCallingProblematicMethods")]
46+
static Assembly LoadAssemblyFromRunDir(object sender, ResolveEventArgs e)
47+
{
48+
try
49+
{
50+
var name = new AssemblyName(e.Name);
51+
if (!ourAssemblies.Contains(name.Name))
52+
return null;
53+
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
54+
var filename = Path.Combine(path, name.Name + ".dll");
55+
if (!File.Exists(filename))
56+
return null;
57+
return Assembly.LoadFrom(filename);
58+
}
59+
catch (Exception ex)
60+
{
61+
var log = string.Format(CultureInfo.CurrentCulture,
62+
"Error occurred loading {0} from {1}.{2}{3}{4}",
63+
e.Name,
64+
Assembly.GetExecutingAssembly().Location,
65+
Environment.NewLine,
66+
ex,
67+
Environment.NewLine);
68+
VsOutputLogger.Write(log);
69+
}
70+
return null;
71+
}
72+
}
73+
}

src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
using System.Windows;
44
using Microsoft.VisualStudio.PlatformUI;
55
using GitHub.VisualStudio.Helpers;
6+
using GitHub.Helpers;
67

78
namespace GitHub.VisualStudio.UI.Helpers
89
{
910
public class SharedDictionaryManager : ResourceDictionary
1011
{
12+
static SharedDictionaryManager()
13+
{
14+
AssemblyResolver.InitializeAssemblyResolver();
15+
}
16+
1117
public SharedDictionaryManager()
1218
{
1319
currentTheme = Colors.DetectTheme();

src/GitHub.VisualStudio/GitHubPackage.cs

Lines changed: 2 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using Microsoft.VisualStudio.Shell;
1818
using Microsoft.VisualStudio.Shell.Interop;
1919
using Octokit;
20+
using GitHub.Helpers;
2021

2122
namespace GitHub.VisualStudio
2223
{
@@ -32,32 +33,12 @@ namespace GitHub.VisualStudio
3233
[ProvideOptionPage(typeof(OptionsPage), "GitHub for Visual Studio", "General", 0, 0, supportsAutomation: true)]
3334
public class GitHubPackage : Package
3435
{
35-
// list of assemblies to be loaded from the extension installation path
36-
static readonly string[] ourAssemblies =
37-
{
38-
"GitHub.Api",
39-
"GitHub.App",
40-
"GitHub.CredentialManagement",
41-
"GitHub.Exports",
42-
"GitHub.Exports.Reactive",
43-
"GitHub.Extensions",
44-
"GitHub.Extensions.Reactive",
45-
"GitHub.UI",
46-
"GitHub.UI.Reactive",
47-
"GitHub.VisualStudio",
48-
"GitHub.TeamFoundation",
49-
"GitHub.TeamFoundation.14",
50-
"GitHub.TeamFoundation.15",
51-
"GitHub.VisualStudio.UI",
52-
"System.Windows.Interactivity"
53-
};
5436

5537
readonly IServiceProvider serviceProvider;
56-
static bool resolverInitialized;
5738

5839
static GitHubPackage()
5940
{
60-
InitializeAssemblyResolver();
41+
AssemblyResolver.InitializeAssemblyResolver();
6142
}
6243

6344
public GitHubPackage()
@@ -70,14 +51,6 @@ public GitHubPackage(IServiceProvider serviceProvider)
7051
this.serviceProvider = serviceProvider;
7152
}
7253

73-
public static void InitializeAssemblyResolver()
74-
{
75-
if (resolverInitialized)
76-
return;
77-
AppDomain.CurrentDomain.AssemblyResolve += LoadAssemblyFromRunDir;
78-
resolverInitialized = true;
79-
}
80-
8154
protected override void Initialize()
8255
{
8356
base.Initialize();
@@ -91,34 +64,6 @@ protected override void Initialize()
9164
serviceProvider.AddCommandHandler(menu.Guid, menu.CmdId, menu.CanShow, () => menu.Activate());
9265
}
9366

94-
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Reliability", "CA2001:AvoidCallingProblematicMethods")]
95-
static Assembly LoadAssemblyFromRunDir(object sender, ResolveEventArgs e)
96-
{
97-
try
98-
{
99-
var name = new AssemblyName(e.Name);
100-
if (!ourAssemblies.Contains(name.Name))
101-
return null;
102-
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
103-
var filename = Path.Combine(path, name.Name + ".dll");
104-
if (!File.Exists(filename))
105-
return null;
106-
return Assembly.LoadFrom(filename);
107-
}
108-
catch (Exception ex)
109-
{
110-
var log = string.Format(CultureInfo.CurrentCulture,
111-
"Error occurred loading {0} from {1}.{2}{3}{4}",
112-
e.Name,
113-
Assembly.GetExecutingAssembly().Location,
114-
Environment.NewLine,
115-
ex,
116-
Environment.NewLine);
117-
VsOutputLogger.Write(log);
118-
}
119-
return null;
120-
}
121-
12267
void IncrementLaunchCount()
12368
{
12469
var usageTracker = serviceProvider.GetExportedValue<IUsageTracker>();

src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using GitHub.Helpers;
2+
using System;
23
using System.Collections.Generic;
34
using System.Windows;
45

@@ -8,7 +9,7 @@ public class SharedDictionaryManager : ResourceDictionary
89
{
910
static SharedDictionaryManager()
1011
{
11-
GitHubPackage.InitializeAssemblyResolver();
12+
AssemblyResolver.InitializeAssemblyResolver();
1213
}
1314

1415
static readonly Dictionary<Uri, ResourceDictionary> resourceDicts = new Dictionary<Uri, ResourceDictionary>();

0 commit comments

Comments
 (0)