IDsDocument ResolveNormal(IAssembly assembly, ModuleDef sourceModule) { var existingDocument = documentService.FindAssembly(assembly); if (existingDocument != null) { return(existingDocument); } var dotNetCoreAppVersion = dotNetCorePathProvider.TryGetDotNetCoreVersion(sourceModule); var document = LookupFromSearchPaths(assembly, sourceModule, dotNetCoreAppVersion); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } var gacFile = GacInfo.FindInGac(assembly); if (gacFile != null) { return(documentService.TryGetOrCreateInternal(DsDocumentInfo.CreateDocument(gacFile), true, true)); } foreach (var path in GacInfo.OtherGacPaths) { document = TryLoadFromDir(assembly, true, path); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } } return(null); }
IDsDocument ResolveNormal(IAssembly assembly, ModuleDef sourceModule) { var fwkKind = GetFrameworkKind(sourceModule, out var netCoreVersion, out var sourceModuleDirectoryHint); IDsDocument document; switch (fwkKind) { case FrameworkKind.Unknown: case FrameworkKind.DotNetFramework2: case FrameworkKind.DotNetFramework4: var tempAsm = assembly; int gacVersion; if (!GacInfo.HasGAC2) { fwkKind = FrameworkKind.DotNetFramework4; } if (fwkKind == FrameworkKind.DotNetFramework4) { FrameworkRedirect.ApplyFrameworkRedirectV4(ref assembly); gacVersion = 4; } else if (fwkKind == FrameworkKind.DotNetFramework2) { FrameworkRedirect.ApplyFrameworkRedirectV2(ref assembly); gacVersion = 2; } else { Debug.Assert(fwkKind == FrameworkKind.Unknown); FrameworkRedirect.ApplyFrameworkRedirect(ref tempAsm, sourceModule); // OK : System.Runtime 4.0.20.0 => 4.0.0.0 // KO : System 4.0.0.0 => 2.0.0.0 if (tempAsm.Version.Major >= assembly.Version.Major) { assembly = tempAsm; } gacVersion = -1; } var existingDocument = documentService.FindAssembly(assembly); if (existingDocument != null) { return(existingDocument); } document = LookupFromSearchPaths(assembly, sourceModule, sourceModuleDirectoryHint, netCoreVersion); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } var gacFile = GacInfo.FindInGac(assembly, gacVersion); if (gacFile != null) { return(documentService.TryGetOrCreateInternal(DsDocumentInfo.CreateDocument(gacFile), true, true)); } foreach (var gacPath in GacInfo.OtherGacPaths) { if (gacVersion == 4) { if (gacPath.Version != GacVersion.V4) { continue; } } else if (gacVersion == 2) { if (gacPath.Version != GacVersion.V2) { continue; } } else { Debug.Assert(gacVersion == -1); } document = TryLoadFromDir(assembly, checkVersion: true, checkPublicKeyToken: true, gacPath.Path); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } } break; case FrameworkKind.DotNetCore: case FrameworkKind.Unity: document = LookupFromSearchPaths(assembly, sourceModule, sourceModuleDirectoryHint, netCoreVersion); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } break; default: throw new InvalidOperationException(); } return(null); }
IDsDocument ResolveNormal(IAssembly assembly, ModuleDef sourceModule) { var fwkKind = GetFrameworkKind(sourceModule, out var netCoreVersion, out var sourceModuleDirectoryHint); if (fwkKind == FrameworkKind.DotNetCore && !dotNetCorePathProvider.HasDotNetCore) fwkKind = FrameworkKind.DotNetFramework4; IDsDocument document; switch (fwkKind) { case FrameworkKind.Unknown: case FrameworkKind.DotNetFramework2: case FrameworkKind.DotNetFramework4: var tempAsm = assembly; int gacVersion; if (!GacInfo.HasGAC2) fwkKind = FrameworkKind.DotNetFramework4; if (fwkKind == FrameworkKind.DotNetFramework4) { FrameworkRedirect.ApplyFrameworkRedirectV4(ref assembly); gacVersion = 4; } else if (fwkKind == FrameworkKind.DotNetFramework2) { FrameworkRedirect.ApplyFrameworkRedirectV2(ref assembly); gacVersion = 2; } else { Debug.Assert(fwkKind == FrameworkKind.Unknown); FrameworkRedirect.ApplyFrameworkRedirect(ref tempAsm, sourceModule); // OK : System.Runtime 4.0.20.0 => 4.0.0.0 // KO : System 4.0.0.0 => 2.0.0.0 if (tempAsm.Version.Major >= assembly.Version.Major) assembly = tempAsm; gacVersion = -1; } var existingDocument = documentService.FindAssembly(assembly); if (existingDocument != null) return existingDocument; document = LookupFromSearchPaths(assembly, sourceModule, sourceModuleDirectoryHint, netCoreVersion); if (document != null) return documentService.GetOrAddCanDispose(document, assembly); var gacFile = GacInfo.FindInGac(assembly, gacVersion); if (gacFile != null) return documentService.TryGetOrCreateInternal(DsDocumentInfo.CreateDocument(gacFile), true, true); foreach (var gacPath in GacInfo.OtherGacPaths) { if (gacVersion == 4) { if (gacPath.Version != GacVersion.V4) continue; } else if (gacVersion == 2) { if (gacPath.Version != GacVersion.V2) continue; } else Debug.Assert(gacVersion == -1); document = TryLoadFromDir(assembly, checkVersion: true, checkPublicKeyToken: true, gacPath.Path); if (document != null) return documentService.GetOrAddCanDispose(document, assembly); } break; case FrameworkKind.DotNetCore: case FrameworkKind.Unity: case FrameworkKind.SelfContainedDotNetCore: // If it's a self-contained .NET Core app, we don't need the version since we must only search // the current directory. Debug.Assert(fwkKind == FrameworkKind.DotNetCore || netCoreVersion == null); document = LookupFromSearchPaths(assembly, sourceModule, sourceModuleDirectoryHint, netCoreVersion); if (document != null) return documentService.GetOrAddCanDispose(document, assembly); break; default: throw new InvalidOperationException(); } return null; }
static string?GetGacFilename(string asmFullName) => GacInfo.FindInGac(new AssemblyNameInfo(asmFullName));
IDsDocument ResolveNormal(IAssembly assembly, ModuleDef sourceModule) { var fwkKind = GetFrameworkKind(sourceModule, out var netCoreVersion, out var sourceModuleDirectoryHint); if (fwkKind == FrameworkKind.DotNetCore && !dotNetCorePathProvider.HasDotNetCore) { fwkKind = FrameworkKind.DotNetFramework4; } IDsDocument document; IDsDocument existingDocument; FindAssemblyOptions options; switch (fwkKind) { case FrameworkKind.Unknown: case FrameworkKind.DotNetFramework2: case FrameworkKind.DotNetFramework4: int gacVersion; if (!GacInfo.HasGAC2) { fwkKind = FrameworkKind.DotNetFramework4; } bool redirected; IAssembly tempAsm; if (fwkKind == FrameworkKind.DotNetFramework4) { redirected = FrameworkRedirect.TryApplyFrameworkRedirectV4(assembly, out tempAsm); if (redirected) { assembly = tempAsm; } gacVersion = 4; } else if (fwkKind == FrameworkKind.DotNetFramework2) { redirected = FrameworkRedirect.TryApplyFrameworkRedirectV2(assembly, out tempAsm); if (redirected) { assembly = tempAsm; } gacVersion = 2; } else { Debug.Assert(fwkKind == FrameworkKind.Unknown); redirected = FrameworkRedirect.TryApplyFrameworkRedirect(assembly, sourceModule, out tempAsm); // OK : System.Runtime 4.0.20.0 => 4.0.0.0 // KO : System 4.0.0.0 => 2.0.0.0 if (redirected && tempAsm.Version.Major >= assembly.Version.Major) { assembly = tempAsm; } else { redirected = false; } gacVersion = -1; } options = DsDocumentService.DefaultOptions; // If the assembly was redirected, always compare the version number. This prevents resolving // mscorlib 2.0 when a .NET 4 app references a .NET 2.0-3.5 dll. We should get mscorlib 4.0. if (redirected) { options |= FindAssemblyOptions.Version; } existingDocument = documentService.FindAssembly(assembly, options); if (existingDocument != null) { return(existingDocument); } document = LookupFromSearchPaths(assembly, sourceModule, sourceModuleDirectoryHint, netCoreVersion); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } var gacFile = GacInfo.FindInGac(assembly, gacVersion); if (gacFile != null) { return(documentService.TryGetOrCreateInternal(DsDocumentInfo.CreateDocument(gacFile), true, true)); } foreach (var gacPath in GacInfo.OtherGacPaths) { if (gacVersion == 4) { if (gacPath.Version != GacVersion.V4) { continue; } } else if (gacVersion == 2) { if (gacPath.Version != GacVersion.V2) { continue; } } else { Debug.Assert(gacVersion == -1); } document = TryLoadFromDir(assembly, checkVersion: true, checkPublicKeyToken: true, gacPath.Path); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } } break; case FrameworkKind.DotNetCore: case FrameworkKind.Unity: case FrameworkKind.SelfContainedDotNetCore: case FrameworkKind.WindowsUniversal: // If it's a self-contained .NET Core app, we don't need the version since we must only search // the current directory. Debug.Assert(fwkKind == FrameworkKind.DotNetCore || netCoreVersion == null); document = LookupFromSearchPaths(assembly, sourceModule, sourceModuleDirectoryHint, netCoreVersion); if (document != null) { return(documentService.GetOrAddCanDispose(document, assembly)); } // If it already exists in assembly explorer, use it options = DsDocumentService.DefaultOptions; if (IgnorePublicKey(fwkKind)) { options &= ~FindAssemblyOptions.PublicKeyToken; } existingDocument = documentService.FindAssembly(assembly, options); if (existingDocument != null) { return(existingDocument); } break; default: throw new InvalidOperationException(); } return(null); }