private static Assembly AssemblyResolve_ManagedProfilerDependencies(object sender, ResolveEventArgs args) { var assemblyName = new AssemblyName(args.Name); // On .NET Framework, having a non-US locale can cause mscorlib // to enter the AssemblyResolve event when searching for resources // in its satellite assemblies. This seems to have been fixed in // .NET Core in the 2.0 servicing branch, so we should not see this // occur, but guard against it anyways. If we do see it, exit early // so we don't cause infinite recursion. if (string.Equals(assemblyName.Name, "System.Private.CoreLib.resources", StringComparison.OrdinalIgnoreCase) || string.Equals(assemblyName.Name, "System.Net.Http", StringComparison.OrdinalIgnoreCase)) { return(null); } var path = Path.Combine(ManagedProfilerDirectory, $"{assemblyName.Name}.dll"); // Only load the main profiler into the default Assembly Load Context. // If OpenTelemetry.AutoInstrumentation or other libraries are provided by the NuGet package their loads are handled in the following two ways. // 1) The AssemblyVersion is greater than or equal to the version used by OpenTelemetry.AutoInstrumentation, the assembly // will load successfully and will not invoke this resolve event. // 2) The AssemblyVersion is lower than the version used by OpenTelemetry.AutoInstrumentation, the assembly will fail to load // and invoke this resolve event. It must be loaded in a separate AssemblyLoadContext since the application will only // load the originally referenced version if (assemblyName.Name.StartsWith("OpenTelemetry.AutoInstrumentation", StringComparison.OrdinalIgnoreCase) && File.Exists(path)) { StartupLogger.Debug("Loading {0} with Assembly.LoadFrom", path); return(Assembly.LoadFrom(path)); } else if (File.Exists(path)) { StartupLogger.Debug("Loading {0} with DependencyLoadContext.LoadFromAssemblyPath", path); return(DependencyLoadContext.LoadFromAssemblyPath(path)); // Load unresolved framework and third-party dependencies into a custom Assembly Load Context } return(null); }
private static Assembly AssemblyResolve_ManagedProfilerDependencies(object sender, ResolveEventArgs args) { var assemblyName = new AssemblyName(args.Name).Name; // On .NET Framework, having a non-US locale can cause mscorlib // to enter the AssemblyResolve event when searching for resources // in its satellite assemblies. Exit early so we don't cause // infinite recursion. if (string.Equals(assemblyName, "mscorlib.resources", StringComparison.OrdinalIgnoreCase) || string.Equals(assemblyName, "System.Net.Http", StringComparison.OrdinalIgnoreCase)) { return(null); } var path = Path.Combine(ManagedProfilerDirectory, $"{assemblyName}.dll"); if (File.Exists(path)) { StartupLogger.Debug("Loading {0}", path); return(Assembly.LoadFrom(path)); } return(null); }