From 59adb4b320a89065bf0b5f53891da0b0f011dc7c Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Fri, 24 Aug 2018 16:50:50 -0700 Subject: [PATCH] Workaround Core CLR p/invoke load context bug Fixes #215 --- src/MSBuildExtensionTask/ContextAwareTask.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/MSBuildExtensionTask/ContextAwareTask.cs b/src/MSBuildExtensionTask/ContextAwareTask.cs index c3c62eb7..e60aae97 100644 --- a/src/MSBuildExtensionTask/ContextAwareTask.cs +++ b/src/MSBuildExtensionTask/ContextAwareTask.cs @@ -80,10 +80,15 @@ internal CustomAssemblyLoader(ContextAwareTask loaderTask) protected override Assembly Load(AssemblyName assemblyName) { + // Always load libgit2sharp in the default context. + // Something about the p/invoke done in that library with its custom marshaler + // doesn't sit well with Core CLR 2.x. + // See https://github.com/AArnott/Nerdbank.GitVersioning/issues/215 and https://github.com/dotnet/coreclr/issues/19654 + AssemblyLoadContext preferredContext = assemblyName.Name.Equals("libgit2sharp", StringComparison.OrdinalIgnoreCase) ? Default : this; string assemblyPath = Path.Combine(this.loaderTask.ManagedDllDirectory, assemblyName.Name) + ".dll"; if (File.Exists(assemblyPath)) { - return LoadFromAssemblyPath(assemblyPath); + return preferredContext.LoadFromAssemblyPath(assemblyPath); } return Default.LoadFromAssemblyName(assemblyName);