示例#1
0
        public static void PathAssemblyResolverBasicPathWithRunningAssemblies()
        {
            string coreAssemblyPath = TestUtils.GetPathToCoreAssembly();

            // Obtain this test class
            string thisAssemblyPath = typeof(MetadataLoadContextTests).Assembly.Location;

            if (PlatformDetection.IsBrowser)
            {
                // prepends slash as Assembly.Location only contains the file name on browser (https://github.com/dotnet/runtime/issues/39650)
                thisAssemblyPath = "/" + thisAssemblyPath;
            }

            var resolver = new PathAssemblyResolver(new string[] { coreAssemblyPath, thisAssemblyPath });

            using (MetadataLoadContext lc = new MetadataLoadContext(resolver, TestUtils.GetNameOfCoreAssembly()))
            {
                AssemblyName thisAssemblyName = typeof(MetadataLoadContextTests).Assembly.GetName();
                Assembly     assembly         = lc.LoadFromAssemblyName(thisAssemblyName);

                Type t = assembly.GetType(typeof(MetadataLoadContextTests).FullName, throwOnError: true);
                Assert.Equal(t.FullName, typeof(MetadataLoadContextTests).FullName);
                Assert.Equal(t.Assembly.Location, thisAssemblyPath);
            }
        }
示例#2
0
    //
    // Given the runtime generated icall table, and a set of assemblies, generate
    // a smaller linked icall table mapping tokens to C function names
    // The runtime icall table should be generated using
    // mono --print-icall-table
    //
    public void GenIcallTable(string runtimeIcallTableFile, string[] assemblies)
    {
        ReadTable(runtimeIcallTableFile);
        var resolver = new PathAssemblyResolver(assemblies);
        var mlc      = new MetadataLoadContext(resolver, "System.Private.CoreLib");

        foreach (var aname in assemblies)
        {
            var a = mlc.LoadFromAssemblyPath(aname);
            foreach (var type in a.GetTypes())
            {
                ProcessType(type);
            }
        }

        string tmpFileName = Path.GetTempFileName();

        using (var w = File.CreateText(tmpFileName))
            EmitTable(w);

        if (Utils.CopyIfDifferent(tmpFileName, OutputPath, useHash: false))
        {
            Log.LogMessage(MessageImportance.Low, $"Generating icall table to '{OutputPath}'.");
        }
        else
        {
            Log.LogMessage(MessageImportance.Low, $"Icall table in {OutputPath} is unchanged.");
        }
        FileWrites = OutputPath;

        File.Delete(tmpFileName);
    }
        public static void DuplicateAssembliesPickHigherVersion()
        {
            using (TempDirectory dir = new TempDirectory())
                using (TempDirectory dir2 = new TempDirectory())
                    using (TempFile core = new TempFile(Path.Combine(dir.Path, TestData.s_PhonyCoreAssemblySimpleName), TestData.s_PhonyCoreAssemblyImage))
                        using (TempFile tf1 = new TempFile(Path.Combine(dir.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleUnsignedVersioned100Image))
                            using (TempFile tf2 = new TempFile(Path.Combine(dir2.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleUnsignedVersioned200Image))
                            {
                                // tf1 first, then tf2.
                                {
                                    var resolver = new PathAssemblyResolver(new string[] { core.Path, tf1.Path, tf2.Path });
                                    using (var lc = new MetadataLoadContext(resolver, TestData.s_PhonyCoreAssemblyFullName))
                                    {
                                        Assembly a1 = lc.LoadFromAssemblyName(TestData.s_SimpleUnsignedVersioned100FullName);
                                        Assert.Equal("2.0.0.0", a1.GetName().Version.ToString());
                                    }
                                }

                                // Reverse the order.
                                {
                                    var resolver = new PathAssemblyResolver(new string[] { core.Path, tf2.Path, tf1.Path });
                                    using (var lc = new MetadataLoadContext(resolver, TestData.s_PhonyCoreAssemblyFullName))
                                    {
                                        Assembly a1 = lc.LoadFromAssemblyName(TestData.s_SimpleUnsignedVersioned100FullName);
                                        Assert.Equal("2.0.0.0", a1.GetName().Version.ToString());
                                    }
                                }
                            }
        }
示例#4
0
        protected async Task <List <RefInfo> > GetRefInfosImpl(string configDir, string pack)
        {
            var sdk = await ZipDownloader.DownloadIfNedeed(configDir, WindowsUrl);

            var brokenDependencies = new[] { "system.printing", "presentationframework" };

            var result = new List <RefInfo>();

            var refDir   = GetRefsDir(sdk, pack);
            var relative = Path.GetRelativePath(sdk, refDir).Replace('\\', '/');
            var dlls     = Directory.GetFiles(refDir, "*.dll");

            PathAssemblyResolver resolver = null;

            if (dlls.All(x => Path.GetFileName(x) != "mscorlib.dll"))
            {
                // Locate mscorlib require for MetadataLoadContext
                var mscorlibDir = GetRefsDir(sdk, "Microsoft.NETCore.App.Ref");
                resolver = new PathAssemblyResolver(dlls.Union(new[] { Path.Combine(mscorlibDir, "mscorlib.dll") }));
            }
            else
            {
                resolver = new PathAssemblyResolver(dlls);
            }

            using var lc = new MetadataLoadContext(resolver);
            var known = dlls.Select(x => Path.GetFileNameWithoutExtension(x).ToLower()).ToArray();

            foreach (var d in dlls)
            {
                try
                {
                    var metadata = lc.LoadFromAssemblyPath(d);
                    var deps     = metadata.GetReferencedAssemblies();
                    var depNames = deps
                                   .Where(y => !brokenDependencies.Contains(y.Name.ToLower()) && known.Contains(y.Name.ToLower()))
                                   .Select(x => $"\":{x.Name.ToLower()}.dll\"");
                    var name       = Path.GetFileName(d);
                    var refname    = $"@core_sdk_{Version}//:core/{relative}/{name}";
                    var stdlibname = GetStdlibPath(sdk, name, pack, InternalVersionFolder, Version);

                    var refInfo = new RefInfo();
                    refInfo.Name       = name.ToLower();
                    refInfo.Version    = metadata.GetName().Version.ToString();
                    refInfo.Ref        = refname;
                    refInfo.StdlibPath = stdlibname;
                    refInfo.Pack       = pack;
                    refInfo.Deps.AddRange(depNames);
                    if (stdlibname != null)
                    {
                        result.Add(refInfo);
                    }
                }
                catch (Exception)
                {
                }
            }

            return(result);
        }
示例#5
0
    public void GenPInvokeTable(string[] pinvokeModules, string[] assemblies)
    {
        var modules = new Dictionary <string, string>();

        foreach (var module in pinvokeModules)
        {
            modules [module] = module;
        }

        var pinvokes  = new List <PInvoke>();
        var callbacks = new List <PInvokeCallback>();

        var resolver = new PathAssemblyResolver(assemblies);
        var mlc      = new MetadataLoadContext(resolver, "System.Private.CoreLib");

        foreach (var aname in assemblies)
        {
            var a = mlc.LoadFromAssemblyPath(aname);
            foreach (var type in a.GetTypes())
            {
                CollectPInvokes(pinvokes, callbacks, type);
            }
        }

        using (var w = File.CreateText(OutputPath !))
        {
            EmitPInvokeTable(w, modules, pinvokes);
            EmitNativeToInterp(w, callbacks);
        }
    }
示例#6
0
    private void GenPInvokeTable(string[] pinvokeModules, string[] assemblies)
    {
        var modules = new Dictionary <string, string> ();

        foreach (var module in pinvokeModules)
        {
            modules [module] = module;
        }

        var pinvokes = new List <PInvoke>();

        var resolver = new PathAssemblyResolver(assemblies);
        var mlc      = new MetadataLoadContext(resolver, "System.Private.CoreLib");

        foreach (var aname in assemblies)
        {
            var a = mlc.LoadFromAssemblyPath(aname);
            foreach (var type in a.GetTypes())
            {
                CollectPInvokes(pinvokes, type);
            }
        }

        Log.LogMessage(MessageImportance.Normal, $"Generating pinvoke table to '{OutputPath}'.");

        using (var w = File.CreateText(OutputPath !))
        {
            EmitPInvokeTable(w, modules, pinvokes);
        }
    }
        public AssemblyMetadataLoader()
        {
            var files = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");
            MetadataAssemblyResolver metadataAssemblyResolver = new PathAssemblyResolver(files);

            _metadataLoadContext = new MetadataLoadContext(metadataAssemblyResolver);
        }
        private (Stream AssemblyStream, Assembly Assembly, MethodInfo[] DecoratedMethods, string AssemblyPath, string[] AliasCategories) FindAssemblyToAnalyze(IPackageCoreReader package, string[] assembliesPath)
        {
            foreach (var assemblyPath in assembliesPath)
            {
                var runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");

                // The assembly resolver makes the assemblies referenced by THIS APPLICATION (i.e.: the AddinDiscoverer) available
                // for resolving types when looping through custom attributes. As of this writing, there is one addin written in
                // FSharp which was causing 'Could not find FSharp.Core' when looping through its custom attributes. To solve this
                // problem, I added a reference to FSharp.Core in Cake.AddinDiscoverer.csproj
                var assemblyResolver = new PathAssemblyResolver(runtimeAssemblies);

                // It's important to create a new load context for each assembly to ensure one addin does not interfere with another
                var loadContext = new MetadataLoadContext(assemblyResolver);

                // Load the assembly
                var assemblyStream = LoadFileFromPackage(package, assemblyPath);
                var assembly       = loadContext.LoadFromStream(assemblyStream);

                var isModule = assembly
                               .CustomAttributes
                               .Any(a => a.AttributeType.Namespace == "Cake.Core.Annotations" && a.AttributeType.Name == "CakeModuleAttribute");

                // Search for decorated methods.
                // Please note that it's important to use the '.ExportedTypes' and the '.CustomAttributes' properties rather than
                // the '.GetExportedTypes' and the '.GetCustomAttributes' methods because the latter will instantiate the custom
                // attributes which, in our case, will cause exceptions because they are defined in dependencies which are most
                // likely not available in the load context.
                var decoratedMethods = assembly
                                       .ExportedTypes
                                       .SelectMany(type => type.GetTypeInfo().DeclaredMethods)
                                       .Where(method =>
                                              method.CustomAttributes.Any(a =>
                                                                          a.AttributeType.Namespace == "Cake.Core.Annotations" &&
                                                                          (a.AttributeType.Name == "CakeMethodAliasAttribute" || a.AttributeType.Name == "CakePropertyAliasAttribute")))
                                       .ToArray();

                // Search for alias categories
                var aliasCategories = assembly
                                      .ExportedTypes
                                      .SelectMany(t => t.CustomAttributes)
                                      .Where(a => a.AttributeType.Namespace == "Cake.Core.Annotations" && a.AttributeType.Name == "CakeAliasCategoryAttribute")
                                      .Select(a => a.ConstructorArguments[0].Value?.ToString())
                                      .Where(category => !string.IsNullOrEmpty(category))
                                      .Distinct(StringComparer.OrdinalIgnoreCase)
                                      .ToArray();

                if (isModule || decoratedMethods.Any())
                {
                    return(assemblyStream, assembly, decoratedMethods, assemblyPath, aliasCategories);
                }
            }

            return(null, null, Array.Empty <MethodInfo>(), string.Empty, Array.Empty <string>());
        }
示例#9
0
        public static Assembly GetAssembly(string assemblyName)
        {
            var runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");
            var paths             = new List <string>(runtimeAssemblies);
            var resolver          = new PathAssemblyResolver(paths);
            var mlc = new MetadataLoadContext(resolver);

            using (mlc)
            {
                return(mlc.LoadFromAssemblyPath(assemblyName));
            }
        }
示例#10
0
        public override async Task <List <RefInfo> > GetRefInfos(string configDir)
        {
            var package = await PackageDownloader.DownloadPackageIfNedeed(configDir, "Microsoft.NETCore.App", InternalVersionFolder);

            var sdkDir = await ZipDownloader.DownloadIfNedeed(configDir, WindowsUrl);

            var brokenDependencies = new string[] { "netstandard" };

            var result = new List <RefInfo>();

            var packageDir   = Path.Combine(package, "packages", $"Microsoft.NETCore.App.{InternalVersionFolder}");
            var frameworkDir = Path.Combine(packageDir, "ref");

            frameworkDir = Directory.GetDirectories(frameworkDir).OrderByDescending(x => x).First();

            var relative = Path.GetRelativePath(packageDir, frameworkDir).Replace('\\', '/');
            var dlls     = Directory.GetFiles(frameworkDir, "*.dll");

            var resolver = new PathAssemblyResolver(dlls);

            using var lc = new MetadataLoadContext(resolver);
            var known = dlls.Select(x => Path.GetFileNameWithoutExtension(x).ToLower()).ToArray();

            foreach (var d in dlls)
            {
                try
                {
                    var metadata = lc.LoadFromAssemblyPath(d);
                    var deps     = metadata.GetReferencedAssemblies();
                    var depNames = deps
                                   .Where(y => !brokenDependencies.Contains(y.Name.ToLower()) && known.Contains(y.Name.ToLower()))
                                   .Select(x => $"\":{x.Name.ToLower()}.dll\"");
                    var name       = Path.GetFileName(d);
                    var refname    = $"@Microsoft.NETCore.App.{InternalVersionFolder}//:{relative}/{name}";
                    var stdlibpath = GetStdlibPath(sdkDir, name, InternalVersionFolder, Version);

                    var refInfo = new RefInfo();
                    refInfo.Name       = name.ToLower();
                    refInfo.Version    = metadata.GetName().Version.ToString();
                    refInfo.Ref        = refname;
                    refInfo.StdlibPath = stdlibpath;
                    refInfo.Pack       = null;
                    refInfo.Deps.AddRange(depNames);
                    result.Add(refInfo);
                }
                catch (Exception)
                {
                }
            }

            return(result);
        }
示例#11
0
    private static PathAssemblyResolver GetTrakxAssemblyResolver()
    {
        var executingAssembly         = Assembly.GetExecutingAssembly();
        var executingAssemblyLocation = new FileInfo(executingAssembly.Location).Directory !.GetFiles("Trakx.*.dll")
                                        .Select(f => f.FullName).ToList();
        var runtimeAssembliesLocations =
            Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");

        var assemblyPaths = runtimeAssembliesLocations.Union(executingAssemblyLocation);
        var resolver      = new PathAssemblyResolver(assemblyPaths);

        return(resolver);
    }
示例#12
0
#pragma warning disable S3442 // "abstract" classes should not have "public" constructors
    internal ReadmeDocumentationUpdaterBase(ITestOutputHelper output, IReadmeEditor?editor, int maxRecursions = 1)
#pragma warning restore S3442 // "abstract" classes should not have "public" constructors
    {
        _output = output;
        var readmeDirectoryInfo = GetRepositoryRootDirectory();
        var readmeFilePath      = Path.Combine(readmeDirectoryInfo.FullName, "README.md");

        _editor        = editor ?? new ReadmeEditor(readmeFilePath);
        _resolver      = GetTrakxAssemblyResolver();
        _maxRecursions = maxRecursions;

        ImplementingAssembly = GetType().Assembly;
    }
示例#13
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Required path to dll");
                return;
            }
            // input.dll outputDir references.txt

            var path                = args[0];
            var outputPath          = args.Length > 1 ? args[1] : null;
            var directory           = Path.GetDirectoryName(path);
            var referencePaths      = args.Length > 2 ? File.ReadAllLines(args[2]) : new string[0];
            var resolver            = new PathAssemblyResolver(referencePaths);
            var corAssembly         = referencePaths.Where(m => m.Contains("mscorlib")).Select(a => AssemblyName.GetAssemblyName(a).FullName).FirstOrDefault();
            var metadataLoadContext = new MetadataLoadContext(resolver, corAssembly);
            var uControllerAssembly = metadataLoadContext.LoadFromAssemblyName(typeof(HttpHandler).Assembly.FullName);
            var handler             = uControllerAssembly.GetType(typeof(HttpHandler).FullName);
            var assembly            = metadataLoadContext.LoadFromAssemblyPath(path);

            var models = new List <HttpModel>();

            foreach (var type in assembly.GetExportedTypes())
            {
                if (handler.IsAssignableFrom(type))
                {
                    var model = HttpModel.FromType(type);
                    models.Add(model);
                }
            }

            if (models.Count > 0 && outputPath != null)
            {
                Directory.CreateDirectory(outputPath);
            }

            foreach (var model in models)
            {
                var gen = new CodeGenerator(model, metadataLoadContext);
                if (outputPath != null)
                {
                    var fileName = Path.Combine(outputPath, model.HandlerType.Name + ".RouteProvider.cs");
                    File.WriteAllText(fileName, gen.Generate());
                }
                else
                {
                    Console.WriteLine(gen.Generate());
                }
            }
        }
示例#14
0
        private List <RefInfo> GetRefInfos(string srcDir, string package, string version)
        {
            var brokenDependencies = new string[] { "system.xml", "system.configuration", "system.windows.forms",
                                                    "system.runtime.remoting", "system.transactions", "system.design", "system.web", "presentationframework",
                                                    "system.printing", "system.servicemodel", "system.data.services.design", "system.workflow.activities",
                                                    "system.data" };

            var result = new List <RefInfo>();

            var packageDir   = GetPackagePath(srcDir, package, version);
            var frameworkDir = GetRefsDir(srcDir, package, version);
            var facadeDir    = Path.Combine(frameworkDir, "Facades");
            var relative     = Path.GetRelativePath(packageDir, frameworkDir).Replace('\\', '/');
            var dlls         = Directory.GetFiles(frameworkDir, "*.dll");
            var facades      = Directory.Exists(facadeDir) ? Directory.GetFiles(facadeDir, "*.dll") : new string[] { };
            var allDlls      = dlls.Union(facades);

            var resolver = new PathAssemblyResolver(allDlls);

            using var lc = new MetadataLoadContext(resolver);
            var known = allDlls.Select(x => Path.GetFileNameWithoutExtension(x).ToLower()).ToArray();

            foreach (var d in allDlls)
            {
                try
                {
                    var metadata = lc.LoadFromAssemblyPath(d);
                    var deps     = metadata.GetReferencedAssemblies();
                    var depNames = deps
                                   .Where(y => !brokenDependencies.Contains(y.Name.ToLower()) && known.Contains(y.Name.ToLower()))
                                   .Select(x => $"\":{x.Name.ToLower()}.dll\"");
                    var name    = Path.GetFileName(d);
                    var refname = facades.Contains(d) ? $"@{package}.{version}//:{relative}/Facades/{name}" : $"@{package}.{version}//:{relative}/{name}";

                    var refInfo = new RefInfo();
                    refInfo.Name       = name.ToLower();
                    refInfo.Version    = metadata.GetName().Version.ToString();
                    refInfo.Ref        = refname;
                    refInfo.StdlibPath = refname;   // Real implementation assemblies are in GAC
                    refInfo.Deps.AddRange(depNames);
                    result.Add(refInfo);
                }
                catch (Exception)
                {
                }
            }

            return(result);
        }
示例#15
0
        public static IMetadataContext CreateContextForDirectories(params string[] assembliesDirectories)
        {
            string[] runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");
            var      paths             = new List <string>(runtimeAssemblies);

            foreach (var directory in assembliesDirectories)
            {
                paths.AddRange(Directory.GetFiles(directory, "*.dll"));
            }

            var pathAssemblyResolver = new PathAssemblyResolver(paths);
            var metadataLoadContext  = new MetadataLoadContext(pathAssemblyResolver);

            return(new MetadataContext(pathAssemblyResolver, metadataLoadContext));
        }
示例#16
0
        private string GetAssemblyVersion()
        {
            var runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");
            var paths             = new List <string>(runtimeAssemblies);
            var resolver          = new PathAssemblyResolver(paths);
            var mlc = new MetadataLoadContext(resolver);

            using (mlc)
            {
                // Load assembly into MetadataLoadContext.
                var assembly = mlc.LoadFromAssemblyPath(Constants.WolvenKitDll);
                var name     = assembly.GetName();
                return(name.Version.ToString());
            }
        }
        public static void RelocatableAssembly()
        {
            string coreAssemblyPath = TestUtils.GetPathToCoreAssembly();
            string coreAssemblyName = Path.GetFileNameWithoutExtension(coreAssemblyPath);

            // Ensure mscorlib is specified since we want to relocate an older mscorlib later.
            string coreDirectory = Path.GetDirectoryName(coreAssemblyPath);
            string mscorLibPath  = Path.Combine(coreDirectory, "mscorlib.dll");

            using (TempDirectory dir = new TempDirectory())
                using (TempFile relocatableAsmFile = new TempFile(Path.Combine(dir.Path, TestData.s_RetargetableAssemblySimpleName), TestData.s_RetargetableImage))
                {
                    var resolver = new PathAssemblyResolver(new string[] { coreAssemblyPath, mscorLibPath, relocatableAsmFile.Path });

                    using (MetadataLoadContext lc = new MetadataLoadContext(resolver, coreAssemblyName))
                    {
                        Assembly retargetableAssembly = lc.LoadFromAssemblyName(TestData.s_RetargetableAssemblySimpleName);
                        Assert.NotNull(retargetableAssembly);

                        // The assembly only contains a reference to an older, retargetable mscorlib.
                        AssemblyName[] assemblyNames            = retargetableAssembly.GetReferencedAssemblies();
                        AssemblyName   retargetableAssemblyName = assemblyNames[0];
                        Assert.Equal(AssemblyNameFlags.Retargetable, retargetableAssemblyName.Flags);
                        Assert.Equal(new Version(2, 0, 5, 0), retargetableAssemblyName.Version);

                        // Trigger PathAssemblyResolver.Resolve for the older mscorlib.
                        Type        myType = retargetableAssembly.GetType("Relocate.MyClass");
                        FieldInfo[] fields = myType.GetFields();
                        Assert.Equal(1, fields.Length);
                        FieldInfo field = fields[0];
                        Assert.Equal("MyObj", field.Name);

                        // Verify that LoadFromAssemblyName also finds the newer mscorlib.
                        Assembly mscorlib = lc.LoadFromAssemblyName(retargetableAssemblyName);
                        Assert.True(mscorlib.GetName().Version > retargetableAssemblyName.Version);

                        // The older reference has a different public key token, which requires AssemblyNameFlags.Retargetable to find the newer assembly.
                        byte[] newerPKT = mscorlib.GetName().GetPublicKeyToken();
                        Assert.NotEmpty(newerPKT);

                        byte[] olderPKT = retargetableAssemblyName.GetPublicKeyToken();
                        Assert.NotEmpty(olderPKT);

                        Assert.False(Enumerable.SequenceEqual(newerPKT, olderPKT));
                    }
                }
        }
 public static void DuplicateUnsignedAssembliesSameVersions()
 {
     using (TempDirectory dir = new TempDirectory())
         using (TempDirectory dir2 = new TempDirectory())
             using (TempFile core = new TempFile(Path.Combine(dir.Path, TestData.s_PhonyCoreAssemblySimpleName), TestData.s_PhonyCoreAssemblyImage))
                 using (TempFile tf1 = new TempFile(Path.Combine(dir.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleUnsignedVersioned100Image))
                     using (TempFile tf2 = new TempFile(Path.Combine(dir2.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleUnsignedVersioned100Image))
                     {
                         var resolver = new PathAssemblyResolver(new string[] { core.Path, tf1.Path, tf2.Path });
                         using (var lc = new MetadataLoadContext(resolver, TestData.s_PhonyCoreAssemblyFullName))
                         {
                             Assembly a1 = lc.LoadFromAssemblyName(TestData.s_SimpleVersionedShortName);
                             Assembly a2 = lc.LoadFromAssemblyName(TestData.s_SimpleUnsignedVersioned100FullName);
                             Assert.Same(a1, a2);
                         }
                     }
 }
示例#19
0
        private List <RefInfo> GetRefInfos(string srcDir)
        {
            var brokenDependencies = new string[] { "system.xml", "system.configuration", "system.windows.forms",
                                                    "system.runtime.remoting", "system.transactions", "system.design", "system.web", "presentationframework",
                                                    "system.printing", "system.servicemodel", "system.data.services.design", "system.workflow.activities",
                                                    "system.data" };

            var result = new List <RefInfo>();

            var dlls    = Directory.GetFiles(srcDir, "*.dll");
            var facades = Directory.GetFiles(Path.Combine(srcDir, "Facades"), "*.dll");
            var allDlls = dlls.Union(facades);

            var resolver = new PathAssemblyResolver(allDlls);

            using var lc = new MetadataLoadContext(resolver);
            var known = allDlls.Select(x => Path.GetFileNameWithoutExtension(x).ToLower()).ToArray();

            foreach (var d in allDlls)
            {
                try
                {
                    var metadata = lc.LoadFromAssemblyPath(d);
                    var deps     = metadata.GetReferencedAssemblies();
                    var depNames = deps
                                   .Where(y => !brokenDependencies.Contains(y.Name.ToLower()) && known.Contains(y.Name.ToLower()))
                                   .Select(x => $"\":{x.Name.ToLower()}.dll\"");
                    var name    = Path.GetFileName(d);
                    var refname = facades.Contains(d) ? $"@Mono.ReferenceAssemblies.v4.5//:build/.NETFramework/v4.5/Facades/{name}"
                        : $"@Mono.ReferenceAssemblies.v4.5//:build/.NETFramework/v4.5/{name}";

                    var refInfo = new RefInfo();
                    refInfo.Name    = name.ToLower();
                    refInfo.Version = metadata.GetName().Version.ToString();
                    refInfo.Ref     = refname;
                    refInfo.Deps.AddRange(depNames);
                    result.Add(refInfo);
                }
                catch (Exception)
                {
                }
            }

            return(result);
        }
示例#20
0
        public static void PathAssemblyResolverBasicPathWithRunningAssemblies()
        {
            string coreAssemblyPath = TestUtils.GetPathToCoreAssembly();

            // Obtain this test class
            string thisAssemblyPath = AssemblyPathHelper.GetAssemblyLocation(typeof(MetadataLoadContextTests).Assembly);
            var    resolver         = new PathAssemblyResolver(new string[] { coreAssemblyPath, thisAssemblyPath });

            using (MetadataLoadContext lc = new MetadataLoadContext(resolver, TestUtils.GetNameOfCoreAssembly()))
            {
                AssemblyName thisAssemblyName = typeof(MetadataLoadContextTests).Assembly.GetName();
                Assembly     assembly         = lc.LoadFromAssemblyName(thisAssemblyName);

                Type t = assembly.GetType(typeof(MetadataLoadContextTests).FullName, throwOnError: true);
                Assert.Equal(t.FullName, typeof(MetadataLoadContextTests).FullName);
                Assert.Equal(t.Assembly.Location, thisAssemblyPath);
            }
        }
    //
    // Given the runtime generated icall table, and a set of assemblies, generate
    // a smaller linked icall table mapping tokens to C function names
    // The runtime icall table should be generated using
    // mono --print-icall-table
    //
    public void GenIcallTable(string runtimeIcallTableFile, string[] assemblies)
    {
        ReadTable(runtimeIcallTableFile);
        var resolver = new PathAssemblyResolver(assemblies);
        var mlc      = new MetadataLoadContext(resolver, "System.Private.CoreLib");

        foreach (var aname in assemblies)
        {
            var a = mlc.LoadFromAssemblyPath(aname);
            foreach (var type in a.GetTypes())
            {
                ProcessType(type);
            }
        }

        using (var w = File.CreateText(OutputPath !))
            EmitTable(w);
    }
示例#22
0
        public static SemVersion GetAssemblyVersion(string assemblyName)
        {
            var runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");
            var paths             = new List <string>(runtimeAssemblies);

            if (paths == null)
            {
                return(SemVersion.Parse("1.0.0"));
            }
            var resolver = new PathAssemblyResolver(paths);
            var mlc      = new MetadataLoadContext(resolver);

            using (mlc)
            {
                var assembly       = mlc.LoadFromAssemblyPath(assemblyName);
                var productVersion = "1.0.0";

                var attributes = assembly.CustomAttributes.ToList();
                for (var i = 0; i < attributes.Count; i++)
                {
                    var a = attributes[i];

                    try
                    {
                        var t = a.AttributeType.Name;


                        if (t == nameof(AssemblyInformationalVersionAttribute))
                        {
                            productVersion = (string)a.ConstructorArguments.First().Value;
                            break;
                        }
                    }
                    catch (FileNotFoundException ex)
                    {
                        // We are missing the required dependency assembly.
                        Console.WriteLine($"Error while getting attribute type: {ex.Message}");
                    }
                }

                var version = SemVersion.Parse(productVersion);
                return(version);
            }
        }
    public void GenPInvokeTable(string[] pinvokeModules, string[] assemblies)
    {
        var modules = new Dictionary <string, string>();

        foreach (var module in pinvokeModules)
        {
            modules [module] = module;
        }

        var pinvokes  = new List <PInvoke>();
        var callbacks = new List <PInvokeCallback>();

        var resolver = new PathAssemblyResolver(assemblies);

        using var mlc = new MetadataLoadContext(resolver, "System.Private.CoreLib");
        foreach (var aname in assemblies)
        {
            var a = mlc.LoadFromAssemblyPath(aname);
            foreach (var type in a.GetTypes())
            {
                CollectPInvokes(pinvokes, callbacks, type);
            }
        }

        string tmpFileName = Path.GetTempFileName();

        using (var w = File.CreateText(tmpFileName))
        {
            EmitPInvokeTable(w, modules, pinvokes);
            EmitNativeToInterp(w, callbacks);
        }

        if (Utils.CopyIfDifferent(tmpFileName, OutputPath, useHash: false))
        {
            Log.LogMessage(MessageImportance.Low, $"Generating pinvoke table to '{OutputPath}'.");
        }
        else
        {
            Log.LogMessage(MessageImportance.Low, $"PInvoke table in {OutputPath} is unchanged.");
        }
        FileWrites = OutputPath;

        File.Delete(tmpFileName);
    }
        private AssemblyInformation LoadManagedAssembly(string entryDll)
        {
            var fileInfo      = new FileInfo(entryDll);
            var directoryPath = Path.GetDirectoryName(entryDll);

            if (directoryPath == null)
            {
                throw new FileNotFoundException(entryDll);
            }

            var runtimeAssemblies = (AppDomain.CurrentDomain.GetData("TRUSTED_PLATFORM_ASSEMBLIES") as string)?.Split(Path.PathSeparator) ?? new string[0];
            var resolver          = new PathAssemblyResolver(runtimeAssemblies);

            using var context = new MetadataLoadContext(resolver);

            var assembly = context.LoadFromAssemblyPath(entryDll);

            return(GetRootManaged(context, assembly.GetName(), directoryPath, fileInfo.Extension.Replace(".", "", StringComparison.InvariantCulture)));
        }
示例#25
0
        private List <RefInfo> GetRefInfos(string srcDir, string package, string version, string sdkDir, string sdkVersion)
        {
            var brokenDependencies = new string[] { "netstandard" };

            var result = new List <RefInfo>();

            var packageDir   = GetPackagePath(srcDir, package, version);
            var frameworkDir = GetRefsDir(srcDir, package, version);
            var relative     = Path.GetRelativePath(packageDir, frameworkDir).Replace('\\', '/');
            var dlls         = Directory.GetFiles(frameworkDir, "*.dll");

            var resolver = new PathAssemblyResolver(dlls);

            using var lc = new MetadataLoadContext(resolver);
            var known = dlls.Select(x => Path.GetFileNameWithoutExtension(x).ToLower()).ToArray();

            foreach (var d in dlls)
            {
                try
                {
                    var metadata = lc.LoadFromAssemblyPath(d);
                    var deps     = metadata.GetReferencedAssemblies();
                    var depNames = deps
                                   .Where(y => !brokenDependencies.Contains(y.Name.ToLower()) && known.Contains(y.Name.ToLower()))
                                   .Select(x => $"\":{x.Name.ToLower()}.dll\"");
                    var name       = Path.GetFileName(d);
                    var refname    = $"@{package}.{version}//:{relative}/{name}";
                    var stdlibpath = GetStdlibPath(sdkDir, name, version, sdkVersion);

                    var refInfo = new RefInfo();
                    refInfo.Name       = name.ToLower();
                    refInfo.Ref        = refname;
                    refInfo.StdlibPath = stdlibpath;
                    refInfo.Deps.AddRange(depNames);
                    result.Add(refInfo);
                }
                catch (Exception)
                {
                }
            }

            return(result);
        }
        public static void SnippetsMetadataLoadContext()
        {
            //<SnippetRuntimeAssemblies>
            // Get the array of runtime assemblies.
            string[] runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");

            // Create the list of assembly paths consisting of runtime assemblies and the inspected assembly.
            var paths = new List <string>(runtimeAssemblies);

            paths.Add("ExampleAssembly.dll");

            // Create PathAssemblyResolver that can resolve assemblies using the created list.
            var resolver = new PathAssemblyResolver(paths);
            //</SnippetRuntimeAssemblies>

            //<SnippetCreateContext>
            var mlc = new MetadataLoadContext(resolver);

            using (mlc)
            {
                // Load assembly into MetadataLoadContext.
                Assembly     assembly = mlc.LoadFromAssemblyPath("ExampleAssembly.dll");
                AssemblyName name     = assembly.GetName();

                // Print assembly attribute information.
                Console.WriteLine($"{name.Name} has following attributes: ");

                foreach (CustomAttributeData attr in assembly.GetCustomAttributesData())
                {
                    try
                    {
                        Console.WriteLine(attr.AttributeType);
                    }
                    catch (FileNotFoundException ex)
                    {
                        // We are missing the required dependency assembly.
                        Console.WriteLine($"Error while getting attribute type: {ex.Message}");
                    }
                }
            }
            //</SnippetCreateContext>
        }
        public static List <RefInfo> GetSdkInfos(string sdkd, string package, Sdk sdk)
        {
            var brokenDependencies = new string[] { };

            var result = new List <RefInfo>();

            var sdkDir = Path.Combine(sdkd, "shared", package, sdk.InternalVersionFolder);
            var dlls   = Directory.GetFiles(sdkDir, "*.dll");

            var resolver = new PathAssemblyResolver(dlls);

            using var lc = new MetadataLoadContext(resolver);
            var known = dlls.Select(x => Path.GetFileNameWithoutExtension(x).ToLower()).ToArray();

            foreach (var d in dlls)
            {
                try
                {
                    var metadata = lc.LoadFromAssemblyPath(d);
                    var deps     = metadata.GetReferencedAssemblies();
                    var depNames = deps
                                   .Where(y => !brokenDependencies.Contains(y.Name.ToLower()) && known.Contains(y.Name.ToLower()))
                                   .Select(x => $"\":{x.Name.ToLower()}.dll\"");
                    var name = Path.GetFileName(d);

                    var refInfo = new RefInfo();
                    refInfo.Name       = name.ToLower();
                    refInfo.Version    = metadata.GetName().Version.ToString();
                    refInfo.StdlibPath =
                        $"@core_sdk_{sdk.Version}//:core/shared/Microsoft.NETCore.App/{sdk.InternalVersionFolder}/{name}";
                    refInfo.Ref =
                        $"@core_sdk_{sdk.Version}//:core/shared/Microsoft.NETCore.App/{sdk.InternalVersionFolder}/{name}";
                    refInfo.Deps.AddRange(depNames);
                    result.Add(refInfo);
                }
                catch (Exception)
                {
                }
            }

            return(result);
        }
        public static void DuplicateSignedAndUnsignedAssemblies()
        {
            using (TempDirectory dir = new TempDirectory())
                using (TempDirectory dir2 = new TempDirectory())
                    using (TempFile core = new TempFile(Path.Combine(dir.Path, TestData.s_PhonyCoreAssemblySimpleName), TestData.s_PhonyCoreAssemblyImage))
                        using (TempFile tf1 = new TempFile(Path.Combine(dir.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleSignedVersioned100Image))
                            using (TempFile tf2 = new TempFile(Path.Combine(dir2.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleUnsignedVersioned100Image))
                            {
                                var resolver = new PathAssemblyResolver(new string[] { core.Path, tf1.Path, tf2.Path });

                                using (var lc = new MetadataLoadContext(resolver, TestData.s_PhonyCoreAssemblyFullName))
                                {
                                    Assert.Equal(1, lc.GetAssemblies().Count());

                                    // These are treated as different since one contains a PublicKeyToken and one does not.
                                    Assembly a1 = lc.LoadFromAssemblyName(TestData.s_SimpleUnsignedVersioned100FullName);
                                    Assembly a2 = lc.LoadFromAssemblyName(TestData.s_SimpleSignedVersioned100FullName);
                                    Assert.NotSame(a1, a2);

                                    Assert.Equal(3, lc.GetAssemblies().Count());
                                }
                            }
        }
示例#29
0
        private List <RefInfo> GetSdkInfos(string sdk, string package, string version)
        {
            var brokenDependencies = new string[] { };

            var result = new List <RefInfo>();

            var sdkDir = Path.Combine(sdk, "shared", package, version);
            var dlls   = Directory.GetFiles(sdkDir, "*.dll");

            var resolver = new PathAssemblyResolver(dlls);

            using var lc = new MetadataLoadContext(resolver);
            var known = dlls.Select(x => Path.GetFileNameWithoutExtension(x).ToLower()).ToArray();

            foreach (var d in dlls)
            {
                try
                {
                    var metadata = lc.LoadFromAssemblyPath(d);
                    var deps     = metadata.GetReferencedAssemblies();
                    var depNames = deps
                                   .Where(y => !brokenDependencies.Contains(y.Name.ToLower()) && known.Contains(y.Name.ToLower()))
                                   .Select(x => $"\":{x.Name.ToLower()}.dll\"");
                    var name = Path.GetFileName(d);

                    var refInfo = new RefInfo();
                    refInfo.Name = name.ToLower();
                    refInfo.Deps.AddRange(depNames);
                    result.Add(refInfo);
                }
                catch (Exception)
                {
                }
            }

            return(result);
        }
        public static void DuplicateSignedAssembliesDifferentVersions()
        {
            using (TempDirectory dir = new TempDirectory())
                using (TempDirectory dir2 = new TempDirectory())
                    using (TempFile core = new TempFile(Path.Combine(dir.Path, TestData.s_PhonyCoreAssemblySimpleName), TestData.s_PhonyCoreAssemblyImage))
                        using (TempFile tf1 = new TempFile(Path.Combine(dir.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleSignedVersioned100Image))
                            using (TempFile tf2 = new TempFile(Path.Combine(dir2.Path, TestData.s_SimpleVersionedShortName), TestData.s_SimpleSignedVersioned200Image))
                            {
                                var resolver = new PathAssemblyResolver(new string[] { core.Path, tf1.Path, tf2.Path });

                                using (var lc = new MetadataLoadContext(resolver, TestData.s_PhonyCoreAssemblyFullName))
                                {
                                    Assert.Equal(1, lc.GetAssemblies().Count());

                                    // Using simple name will find first assembly that matches.
                                    Assembly a1 = lc.LoadFromAssemblyName(TestData.s_SimpleVersionedShortName);
                                    Assembly a2 = lc.LoadFromAssemblyName(TestData.s_SimpleSignedVersioned100FullName);
                                    Assembly a3 = lc.LoadFromAssemblyName(TestData.s_SimpleSignedVersioned200FullName);
                                    Assert.True(object.ReferenceEquals(a1, a2) || object.ReferenceEquals(a1, a3));

                                    Assert.Equal(3, lc.GetAssemblies().Count());
                                }
                            }
        }