| File: netcore\Runtime\PlatformAssemblyResolver.cs | Web Access |
| Project: src\vstest\src\Microsoft.TestPlatform.PlatformAbstractions\Microsoft.TestPlatform.PlatformAbstractions.csproj (Microsoft.TestPlatform.PlatformAbstractions) |
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #if NET using System; using System.Reflection; using System.Runtime.Loader; using Microsoft.VisualStudio.TestPlatform.PlatformAbstractions.Interfaces; namespace Microsoft.VisualStudio.TestPlatform.PlatformAbstractions; /// <inheritdoc/> public class PlatformAssemblyResolver : IAssemblyResolver { /// <summary> /// Specifies whether the resolver is disposed or not /// </summary> private bool _disposed; /// <summary> /// Initializes a new instance of the <see cref="PlatformAssemblyResolver"/> class. /// </summary> public PlatformAssemblyResolver() { AssemblyLoadContext.Default.Resolving += AssemblyResolverEvent; } ~PlatformAssemblyResolver() { Dispose(false); } /// <inheritdoc/> public event AssemblyResolveEventHandler? AssemblyResolve; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { AssemblyLoadContext.Default.Resolving -= AssemblyResolverEvent; } _disposed = true; } /// <summary> /// Assembly Resolve event handler for App Domain - called when CLR loader cannot resolve assembly. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="eventArgs"> /// The event Args. /// </param> /// <returns> /// The <see cref="Assembly"/>. /// </returns> private Assembly? AssemblyResolverEvent(object sender, object eventArgs) { // AssemblyLoadContext.Resolving does not expose the requesting assembly, so null is passed explicitly. return eventArgs is not AssemblyName args ? null : AssemblyResolve?.Invoke(this, new AssemblyResolveEventArgs(args.Name, requestingAssembly: null)); } } #endif