예제 #1
0
        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);
        }
예제 #2
0
		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;
		}