protected override void ConfigureHostSetup(HostSetup hostSetup, TestPackage testPackage, string assemblyPath, AssemblyMetadata assemblyMetadata)
        {
            base.ConfigureHostSetup(hostSetup, testPackage, assemblyPath, assemblyMetadata);

            // csUnit always creates its own AppDomain with shadow copy enabled so we do not need this.
            hostSetup.ShadowCopy = false;
        }
示例#2
0
        protected override void ConfigureHostSetup(HostSetup hostSetup, TestPackage testPackage,
            string assemblyPath, AssemblyMetadata assemblyMetadata)
        {
            base.ConfigureHostSetup(hostSetup, testPackage, assemblyPath, assemblyMetadata);

            if (hostSetup.ProcessorArchitecture == ProcessorArchitecture.Amd64
                || hostSetup.ProcessorArchitecture == ProcessorArchitecture.IA64)
                throw new ModelException("Cannot run MSTest tests compiled for 64bit because MSTest.exe throws exceptions when run without isolation as a 64bit process.");

            hostSetup.ProcessorArchitecture = ProcessorArchitecture.X86;
        }
示例#3
0
        /// <summary>
        /// Load the assembly in the reflection context by name. Will succeed if the referenced assembly name can 
        /// be found using default assembly loading rules (i.e. it is in the current directory or the GAC)
        /// </summary>
        /// <param name="assemblyName">The full name of the assembly</param>
        /// <returns>Information on the given assembly, if it was loaded successfully, or null if there is an 
        /// assembly loading issue. </returns>
        public AssemblyMetadata GetReflectedAssemblyInfo(string assemblyName)
        {
            if (string.IsNullOrWhiteSpace(assemblyName))
            {
                throw new ArgumentException("assemblyName");
            }

            AssemblyMetadata result = null;
            try
            {
                result = new AssemblyMetadata(Assembly.ReflectionOnlyLoad(assemblyName));
            }
            catch
            {
            }

            return result;
        }
        /// <summary>
        /// Extracts types, extensions and namespaces data from given assembly and adds it to global
        /// collections to make sure we have unique data accross all assemblies in a package.
        /// </summary>
        public void ProcessAssembly(AssemblyMetadata assembly)
        {
            try
            {
                var metadata = MetadataReference.CreateFromFile(assembly.FullPath);

                // create an empty CSharp compillation and add a single reference to given assembly.
                // Note: Even though we do use CSharp compillation here, we only se it to retrieve 
                // metadata, that should be common accross .Net assemblies (most of the times according to Roslyn)
                var compilation = CSharpCompilation.Create("dummy.dll", references: new[] { metadata });
                var assemblySymbol = (IAssemblySymbol)compilation.GetAssemblyOrModuleSymbol(metadata);

                ProcessNamespace(assembly, assemblySymbol.GlobalNamespace);
            }
            catch(Exception e)
            {
                Debug.Write(e.ToString());
            }
        }
示例#5
0
 protected override Metadata GetMetadataImpl()
 {
     return(AssemblyMetadata.CreateFromImage(_metadataBytes));
 }
示例#6
0
 internal static MetadataReference CompileIL(string ilSource, bool prependDefaultHeader = true, bool embedInteropTypes = false, bool autoInherit = true)
 {
     EmitILToArray(ilSource, prependDefaultHeader, includePdb: false, assemblyBytes: out var assemblyBytes, pdbBytes: out var pdbBytes, autoInherit: autoInherit);
     return(AssemblyMetadata.CreateFromImage(assemblyBytes).GetReference(embedInteropTypes: embedInteropTypes));
 }
示例#7
0
        private void CompileTimeAndRuntimeAssemblies(
            ImmutableArray <MetadataReference> compileReferences,
            ImmutableArray <MetadataReference> runtimeReferences,
            string storageAssemblyName)
        {
            var source =
                @"class C
{
    static void M(LibraryA.A a, LibraryB.B b, Windows.Data.Text.TextSegment t, Windows.Storage.StorageFolder f)
    {
    }
}";
            var compilation0 = CreateEmptyCompilation(source, compileReferences, TestOptions.DebugDll);

            WithRuntimeInstance(compilation0, runtimeReferences, runtime =>
            {
                var context = CreateMethodContext(runtime, "C.M");
                string error;
                var testData = new CompilationTestData();
                context.CompileExpression("(object)a ?? (object)b ?? (object)t ?? f", out error, testData);
                Assert.Null(error);
                testData.GetMethodData("<>x.<>m0").VerifyIL(
                    @"{
  // Code size       17 (0x11)
  .maxstack  2
  IL_0000:  ldarg.0
  IL_0001:  dup
  IL_0002:  brtrue.s   IL_0010
  IL_0004:  pop
  IL_0005:  ldarg.1
  IL_0006:  dup
  IL_0007:  brtrue.s   IL_0010
  IL_0009:  pop
  IL_000a:  ldarg.2
  IL_000b:  dup
  IL_000c:  brtrue.s   IL_0010
  IL_000e:  pop
  IL_000f:  ldarg.3
  IL_0010:  ret
}");
                testData   = new CompilationTestData();
                var result = context.CompileExpression("default(Windows.Storage.StorageFolder)", out error, testData);
                Assert.Null(error);
                var methodData = testData.GetMethodData("<>x.<>m0");
                methodData.VerifyIL(
                    @"{
  // Code size        2 (0x2)
  .maxstack  1
  IL_0000:  ldnull
  IL_0001:  ret
}");
                // Check return type is from runtime assembly.
                var assemblyReference = AssemblyMetadata.CreateFromImage(result.Assembly).GetReference();
                var compilation       = CSharpCompilation.Create(
                    assemblyName: ExpressionCompilerUtilities.GenerateUniqueName(),
                    references: runtimeReferences.Concat(ImmutableArray.Create <MetadataReference>(assemblyReference)));
                var assembly = ImmutableArray.CreateRange(result.Assembly);
                using (var metadata = ModuleMetadata.CreateFromImage(ImmutableArray.CreateRange(assembly)))
                {
                    var reader          = metadata.MetadataReader;
                    var typeDef         = reader.GetTypeDef("<>x");
                    var methodHandle    = reader.GetMethodDefHandle(typeDef, "<>m0");
                    var module          = (PEModuleSymbol)compilation.GetMember("<>x").ContainingModule;
                    var metadataDecoder = new MetadataDecoder(module);
                    SignatureHeader signatureHeader;
                    BadImageFormatException metadataException;
                    var parameters = metadataDecoder.GetSignatureForMethod(methodHandle, out signatureHeader, out metadataException);
                    Assert.Equal(5, parameters.Length);
                    var actualReturnType = parameters[0].Type;
                    Assert.Equal(TypeKind.Class, actualReturnType.TypeKind); // not error
                    var expectedReturnType = compilation.GetMember("Windows.Storage.StorageFolder");
                    Assert.Equal(expectedReturnType, actualReturnType);
                    Assert.Equal(storageAssemblyName, actualReturnType.ContainingAssembly.Name);
                }
            });
        }
示例#8
0
        public PEDeltaAssemblyBuilder(
            SourceAssemblySymbol sourceAssembly,
            string outputName,
            OutputKind outputKind,
            ModulePropertiesForSerialization serializationProperties,
            IEnumerable <ResourceDescription> manifestResources,
            Func <AssemblySymbol, AssemblyIdentity> assemblySymbolMapper,
            EmitBaseline previousGeneration,
            IEnumerable <SemanticEdit> edits)
            : base(sourceAssembly, outputName, outputKind, serializationProperties, manifestResources, assemblySymbolMapper, additionalTypes: ImmutableArray <NamedTypeSymbol> .Empty, metadataOnly: false)
        {
            var context          = new Context(this, null, new DiagnosticBag());
            var module           = previousGeneration.OriginalMetadata;
            var compilation      = sourceAssembly.DeclaringCompilation;
            var metadataAssembly = compilation.GetBoundReferenceManager().CreatePEAssemblyForAssemblyMetadata(AssemblyMetadata.Create(module), MetadataImportOptions.All);
            var metadataDecoder  = new Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE.MetadataDecoder(metadataAssembly.PrimaryModule);

            previousGeneration = EnsureInitialized(previousGeneration, metadataDecoder);

            var matchToMetadata = new SymbolMatcher(previousGeneration.AnonymousTypeMap, sourceAssembly, context, metadataAssembly);

            SymbolMatcher matchToPrevious = null;

            if (previousGeneration.Ordinal > 0)
            {
                var previousAssembly = ((CSharpCompilation)previousGeneration.Compilation).SourceAssembly;
                var previousContext  = new Context((PEModuleBuilder)previousGeneration.PEModuleBuilder, null, new DiagnosticBag());
                matchToPrevious = new SymbolMatcher(previousGeneration.AnonymousTypeMap, sourceAssembly, context, previousAssembly, previousContext);
            }

            this.previousDefinitions = new DefinitionMap(previousGeneration.OriginalMetadata.Module, metadataDecoder, matchToMetadata, matchToPrevious, GenerateMethodMap(edits));
            this.previousGeneration  = previousGeneration;
            this.changes             = new SymbolChanges(this.previousDefinitions, edits);
        }
示例#9
0
        protected virtual MemoryStream CreateAndCompileToStream(string templateSource, RazorEngineCompilationOptions options)
        {
            templateSource = this.WriteDirectives(templateSource, options);

            RazorProjectEngine engine = RazorProjectEngine.Create(
                RazorConfiguration.Default,
                RazorProjectFileSystem.Create(@"."),
                (builder) =>
            {
                builder.SetNamespace(options.TemplateNamespace);
            });

            string fileName = string.IsNullOrWhiteSpace(options.TemplateFilename) ? Path.GetRandomFileName() : options.TemplateFilename;

            RazorSourceDocument document = RazorSourceDocument.Create(templateSource, fileName);

            RazorCodeDocument codeDocument = engine.Process(
                document,
                null,
                new List <RazorSourceDocument>(),
                new List <TagHelperDescriptor>());

            RazorCSharpDocument razorCSharpDocument = codeDocument.GetCSharpDocument();

            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(razorCSharpDocument.GeneratedCode);

            CSharpCompilation compilation = CSharpCompilation.Create(
                fileName,
                new[]
            {
                syntaxTree
            },
                options.ReferencedAssemblies
                .Select(ass =>
            {
#if NETSTANDARD2_0
                return(MetadataReference.CreateFromFile(ass.Location));
#else
                unsafe
                {
                    ass.TryGetRawMetadata(out byte *blob, out int length);
                    ModuleMetadata moduleMetadata                 = ModuleMetadata.CreateFromMetadata((IntPtr)blob, length);
                    AssemblyMetadata assemblyMetadata             = AssemblyMetadata.Create(moduleMetadata);
                    PortableExecutableReference metadataReference = assemblyMetadata.GetReference();

                    return(metadataReference);
                }
#endif
            })
                .Concat(options.MetadataReferences)
                .ToList(),
                new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            MemoryStream memoryStream = new MemoryStream();

            EmitResult emitResult = compilation.Emit(memoryStream);

            if (!emitResult.Success)
            {
                RazorEngineCompilationException exception = new RazorEngineCompilationException()
                {
                    Errors        = emitResult.Diagnostics.ToList(),
                    GeneratedCode = razorCSharpDocument.GeneratedCode
                };

                throw exception;
            }

            memoryStream.Position = 0;

            return(memoryStream);
        }
示例#10
0
 /// <summary>
 /// Configures the host setup prior to the initialization of the script runtime.
 /// </summary>
 /// <remarks>
 /// <para>
 /// The default implementation does nothing.  Subclasses may override this method
 /// to customize the host setup.
 /// </para>
 /// </remarks>
 /// <param name="hostSetup">The host setup, not null.</param>
 /// <param name="testPackage">The test package, not null.</param>
 /// <param name="assemblyPath">The assembly path, not null.</param>
 /// <param name="assemblyMetadata">The assembly metadata, not null.</param>
 protected virtual void ConfigureHostSetup(HostSetup hostSetup, TestPackage testPackage, string assemblyPath, AssemblyMetadata assemblyMetadata)
 {
 }
示例#11
0
        /// <summary>
        /// </summary>
        /// <param name="assemblyMetadata">
        /// </param>
        /// <returns>
        /// </returns>
        private ModuleReferences<AssemblySymbol> LoadReferences(AssemblyMetadata assemblyMetadata)
        {
            var peReferences = ImmutableArray.CreateRange(assemblyMetadata.Assembly.AssemblyReferences.Select(this.LoadAssemblySymbolOrMissingAssemblySymbol));

            var moduleReferences = new ModuleReferences<AssemblySymbol>(
                assemblyMetadata.Assembly.AssemblyReferences, peReferences, ImmutableArray.CreateRange(this.unifiedAssemblies));

            return moduleReferences;
        }
示例#12
0
 public static ModuleInstance Create(ImmutableArray <byte> assemblyImage, ISymUnmanagedReader symReader, bool includeLocalSignatures = true)
 {
     // create a new instance of metadata, the resulting object takes an ownership:
     return(Create(AssemblyMetadata.CreateFromImage(assemblyImage), symReader, includeLocalSignatures));
 }
示例#13
0
 private static string GetLibKey(AssemblyMetadata metadata, Platform.AbstractPlatform platform)
 {
     return(metadata.CanonicalKey + "#" + platform.Name);
 }
示例#14
0
        public void AssemblyMetadataShouldNotBeNullTest()
        {
            AssemblyMetadata assemblyMetadata = new AssemblyMetadata();

            Assert.IsTrue(assemblyMetadata != null);
        }
示例#15
0
 private void Initialize(Assembly assembly)
 {
     _metadata = new AssemblyMetadata(assembly);
     _debugDirectoryBuilder = new DebugDirectoryBuilder();
 }
示例#16
0
        public unsafe static void DoMyDynamicCompile()
        {
            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(
                "using System.Collections.Generic; " +
                "using Microsoft.AspNet.Mvc; " +
                "using DynamicApi.Web.Models; " +
                "using DynamicApi.Web.Repositories; " +
                "namespace DynamicApi.Web.Controllers {" +
                "[Route(\"api /[controller]\")] " +
                "public class ValuesController : Controller<Values> { public ValuesController(IRepository<Values> repository) : base(repository) { }}}");

            string assemblyName = Path.GetRandomFileName();

            byte *            b;
            int               length;
            MetadataReference reference = null;
            var               assembly  = typeof(Controller <>).GetTypeInfo().Assembly; //let's grab the Controller in-memory assembly

            if (assembly.TryGetRawMetadata(out b, out length))
            {
                var moduleMetadata   = ModuleMetadata.CreateFromMetadata((IntPtr)b, length);
                var assemblyMetadata = AssemblyMetadata.Create(moduleMetadata);
                reference = assemblyMetadata.GetReference();
            }

            MetadataReference[] references = new MetadataReference[]
            {
                MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Attribute).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Controller).GetTypeInfo().Assembly.Location),
                MetadataReference.CreateFromFile(typeof(RouteAttribute).GetTypeInfo().Assembly.Location),
                reference
            };

            var compilation = CSharpCompilation.Create(
                assemblyName,
                syntaxTrees: new[] { syntaxTree },
                references: references,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            using (var ms = new MemoryStream())
            {
                EmitResult result = compilation.Emit(ms);

                if (!result.Success)
                {
                    IEnumerable <Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
                                                                                 diagnostic.IsWarningAsError ||
                                                                                 diagnostic.Severity == DiagnosticSeverity.Error);

                    foreach (Diagnostic diagnostic in failures)
                    {
                        Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());
                    }
                }
                else
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    Assembly.Load(new AssemblyName(assemblyName));
                    //var myAssembly = Assembly.Load(ms.ToArray());
                }
            }
        }
        private ValueTuple <Metadata, ImmutableArray <ITemporaryStreamStorage> >?TryReadMetadataFrom(
            ObjectReader reader, SerializationKinds kind, CancellationToken cancellationToken)
        {
            var imageKind = reader.ReadInt32();

            if (imageKind == MetadataFailed)
            {
                // error case
                return(null);
            }

            var metadataKind = (MetadataImageKind)imageKind;

            if (metadataKind == MetadataImageKind.Assembly)
            {
                using (var pooledMetadata = Creator.CreateList <ModuleMetadata>())
                    using (var pooledStorage = Creator.CreateList <ITemporaryStreamStorage>())
                    {
                        var count = reader.ReadInt32();
                        for (var i = 0; i < count; i++)
                        {
                            metadataKind = (MetadataImageKind)reader.ReadInt32();
                            Contract.ThrowIfFalse(metadataKind == MetadataImageKind.Module);

                            var tuple = ReadModuleMetadataFrom(reader, kind, cancellationToken);

                            pooledMetadata.Object.Add(tuple.Item1);
                            pooledStorage.Object.Add(tuple.Item2);
                        }

                        return(ValueTuple.Create <Metadata, ImmutableArray <ITemporaryStreamStorage> >(AssemblyMetadata.Create(pooledMetadata.Object), pooledStorage.Object.ToImmutableArrayOrEmpty()));
                    }
            }

            Contract.ThrowIfFalse(metadataKind == MetadataImageKind.Module);

            var moduleInfo = ReadModuleMetadataFrom(reader, kind, cancellationToken);

            return(ValueTuple.Create <Metadata, ImmutableArray <ITemporaryStreamStorage> >(moduleInfo.Item1, ImmutableArray.Create(moduleInfo.Item2)));
        }
示例#18
0
 /// <summary>
 /// Creates a host setup for a particular assembly within a test package.
 /// </summary>
 /// <param name="testPackage">The test package, not null.</param>
 /// <param name="assemblyPath">The assembly path, not null.</param>
 /// <param name="assemblyMetadata">The assembly metadata, not null.</param>
 /// <returns>The host setup setup.</returns>
 protected HostSetup CreateHostSetup(TestPackage testPackage, string assemblyPath, AssemblyMetadata assemblyMetadata)
 {
     HostSetup hostSetup = testPackage.CreateHostSetup();
     ConfigureHostSetupForAssembly(hostSetup, assemblyPath, assemblyMetadata);
     ConfigureHostSetup(hostSetup, testPackage, assemblyPath, assemblyMetadata);
     return hostSetup;
 }
示例#19
0
 public SQLDeserialization()
 {
     asmMetadata = new AssemblyMetadata();
     asm         = new AssemblyContext();
 }
示例#20
0
 /// <summary>
 /// </summary>
 /// <param name="assemblyMetadata">
 /// </param>
 /// <returns>
 /// </returns>
 private static PEAssemblySymbol GetAssemblySymbol(AssemblyMetadata assemblyMetadata)
 {
     return new PEAssemblySymbol(assemblyMetadata.Assembly, DocumentationProvider.Default, isLinked: false, importOptions: MetadataImportOptions.All);
 }
示例#21
0
        /// <summary>
        /// Use Roslyn to create an assembly.
        /// </summary>
        /// <param name="fn">File to compile. Also used for assembly name.</param>
        /// <returns></returns>
        public bool Compile(string fn)
        {
            CompiledAssembly = null;
            Errors.Clear();

            string sc          = File.ReadAllText(fn);
            string newAssyName = Path.GetFileNameWithoutExtension(fn);

            // Assemble references.
            var mr = new List <MetadataReference>();

            // Remarks:
            //     Performance considerations:
            //     It is recommended to use Microsoft.CodeAnalysis.AssemblyMetadata.CreateFromFile(System.String)
            //     API when creating multiple references to the same assembly. Reusing Microsoft.CodeAnalysis.AssemblyMetadata
            //     object allows for sharing data across these references.

            //var myAssy = Assembly.GetExecutingAssembly();
            //var refAssys = myAssy.GetReferencedAssemblies();

            // Add reference to almost everything we have loaded now.
            var           loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            List <string> ignore           = new List <string> {
                "Dex9.exe", "Microsoft.CodeAnalysis.dll", "Microsoft.CodeAnalysis.CSharp.dll"
            };

            foreach (var lassy in loadedAssemblies)
            {
                string loc = lassy.Location;

                if (ignore.TrueForAll(i => !loc.Contains(i)))
                {
                    Debug.WriteLine(loc);
                    AssemblyMetadata amd = AssemblyMetadata.CreateFromFile(loc);
                    mr.Add(amd.GetReference());
                }
            }

            // Parse the source.
            SyntaxTree syntaxTree                = CSharpSyntaxTree.ParseText(sc);
            CSharpCompilationOptions opts        = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
            CSharpCompilation        compilation = CSharpCompilation.Create(newAssyName, new[] { syntaxTree }, mr, opts);

            // Compile the source.
            using (var memoryStream = new MemoryStream())
            {
                var result = compilation.Emit(memoryStream);

                if (result.Success)
                {
                    memoryStream.Seek(0, SeekOrigin.Begin);
                    CompiledAssembly = Assembly.Load(memoryStream.ToArray());
                }
                else
                {
                    foreach (var diag in result.Diagnostics)
                    {
                        Errors.Add(FormatDiagnostic(diag, fn));
                    }
                }
            }

            return(Errors.Count == 0 && CompiledAssembly != null);
        }
示例#22
0
        public void NamesFromTypeArguments_LongTuples()
        {
            var source =
                @"class A1 { }
class A2 { }
class A3 { }
class A4 { }
class A5 { }
class A6 { }
class A7 { }
class A8 { }
class B1 { }
class B2 { }
class B3 { }
class B4 { }
class B5 { }
class B6 { }
class B7 { }
class B8 { }
class B9 { }
class B10 { }
class C1 { }
class C2 { }
class A<T, U>
{
    (dynamic A1, A2 A2, T A3, A4 A4, A5 A5, U A6, A7 A7, A8 A8, (T A9, U A10) A11) F =
        (new A1(), new A2(), default(T), new A4(), new A5(), default(U), new A7(), new A8(), (default(T), default(U)));
}
class B
{
    A<((dynamic B1, B2 B2) B3, B4 B4, dynamic B5, B6 B6, B7 B7, dynamic B8, B9 B9, B10 B10, dynamic B11), (C1 C1, (C2 C2, dynamic C3) C4)> G =
        new A<((dynamic B1, B2 B2) B3, B4 B4, dynamic B5, B6 B6, B7 B7, dynamic B8, B9 B9, B10 B10, dynamic B11), (C1 C1, (C2 C2, dynamic C3) C4)>();
}";
            var assembly0    = GenerateTupleAssembly();
            var reference0   = AssemblyMetadata.CreateFromImage(assembly0).GetReference();
            var compilation1 = CSharpTestBaseBase.CreateCompilationWithMscorlib45AndCSruntime(source, additionalRefs: new[] { reference0 });
            var assembly1    = compilation1.EmitToArray();
            var runtime      = new DkmClrRuntimeInstance(ReflectionUtilities.GetMscorlib(ReflectionUtilities.Load(assembly0), ReflectionUtilities.Load(assembly1)));

            using (runtime.Load())
            {
                var type       = runtime.GetType("B");
                var value      = type.Instantiate();
                var evalResult = FormatResult("o", value);
                var children   = GetChildren(evalResult);
                Verify(children,
                       EvalResult(
                           "G",
                           "{A<((object, B2), B4, object, B6, B7, object, B9, B10, object), (C1, (C2, object))>}",
                           "A<((dynamic B1, B2 B2) B3, B4 B4, dynamic B5, B6 B6, B7 B7, dynamic B8, B9 B9, B10 B10, dynamic B11), (C1 C1, (C2 C2, dynamic C3) C4)> {A<((object, B2), B4, object, B6, B7, object, B9, B10, object), (C1, (C2, object))>}",
                           "o.G",
                           DkmEvaluationResultFlags.Expandable));
                children = GetChildren(children[0]);
                Verify(children,
                       EvalResult(
                           "F",
                           "({A1}, {A2}, ((null, null), null, null, null, null, null, null, null, null), {A4}, {A5}, (null, (null, null)), {A7}, {A8}, (((null, null), null, null, null, null, null, null, null, null), (null, (null, null))))",
                           "(dynamic A1, A2 A2, ((dynamic B1, B2 B2) B3, B4 B4, dynamic B5, B6 B6, B7 B7, dynamic B8, B9 B9, B10 B10, dynamic B11) A3, A4 A4, A5 A5, (C1 C1, (C2 C2, dynamic C3) C4) A6, A7 A7, A8 A8, (((dynamic B1, B2 B2) B3, B4 B4, dynamic B5, B6 B6, B7 B7, dynamic B8, B9 B9, B10 B10, dynamic B11) A9, (C1 C1, (C2 C2, dynamic C3) C4) A10) A11) {(object, A2, ((object, B2), B4, object, B6, B7, object, B9, B10, object), A4, A5, (C1, (C2, object)), A7, A8, (((object, B2), B4, object, B6, B7, object, B9, B10, object), (C1, (C2, object))))}",
                           "o.G.F",
                           DkmEvaluationResultFlags.Expandable));
            }
        }
示例#23
0
        static void Main(string[] args)
        {
            tracer.Tracer(TraceEventType.Information, "Program started");
            string   pathToDll      = @"..\..\..\Logic\bin\Debug\Logic.dll";
            Assembly dotNetAssembly = Assembly.LoadFrom(pathToDll);

            assemblyMetadata = new AssemblyMetadata(dotNetAssembly);

            // add namespaces to Dictionary
            Console.WriteLine("Choose namespace");
            foreach (NamespaceMetadata @namespace in assemblyMetadata.m_Namespaces)
            {
                namespaces.Add(@namespace.m_NamespaceName, @namespace);
                Console.WriteLine(@namespace.m_NamespaceName);
            }

            // get namespace name from user
            string userInput;

            bool trigger = true;

            do
            {
                Console.Write(">>> ");
                userInput = Console.ReadLine();
                if (userInput == null)
                {
                    Console.WriteLine("No input from user!");
                    tracer.Tracer(TraceEventType.Warning, "No input from user!");
                }

                if (namespaces.ContainsKey(userInput))
                {
                    trigger           = false;
                    selectedNamespace = userInput;
                    tracer.Tracer(TraceEventType.Information, "selected namespace" + selectedNamespace);

                    // list types from selected dll file from namespace Reflection
                    tracer.Tracer(TraceEventType.Start, "default types display");
                    ListDefaultTypes(userInput);
                    tracer.Tracer(TraceEventType.Stop, "default types displayed");
                }
            } while (trigger);

            do
            {
                // print command prompt
                Console.Write(">>> ");

                userInput = Console.ReadLine();

                if (userInput == null)
                {
                    Console.WriteLine("No input from user!");
                    tracer.Tracer(TraceEventType.Warning, "No input from user!");
                    continue;
                }

                string command = userInput.Split(' ')[0];

                switch (command)
                {
                case "list":
                    tracer.Tracer(TraceEventType.Start, "listing start");
                    if (userInput.Split(' ').Length == 2)
                    {
                        string selectedType = userInput.Split(' ')[1];

                        if (expandableTypes.ContainsKey(selectedType))
                        {
                            ExpandType(selectedType);
                        }
                        else
                        {
                            Console.WriteLine("Invalid type name");
                        }

                        tracer.Tracer(TraceEventType.Start, "expanded type " + selectedType);
                    }
                    else
                    {
                        Console.WriteLine("Write the type that you want to expand!");
                        tracer.Tracer(TraceEventType.Warning, "no type specified");
                    }
                    tracer.Tracer(TraceEventType.Stop, "listing stop");
                    break;

                case "back":
                    tracer.Tracer(TraceEventType.Information, "go back");
                    GoBack();
                    break;

                case "exit":
                    tracer.Tracer(TraceEventType.Information, "Program stopped");
                    return;

                case "help":
                    tracer.Tracer(TraceEventType.Information, "help");
                    Console.WriteLine("Available commands:\n" +
                                      "\tlist [type to expand]\n" +
                                      "\tback\n" +
                                      "\texit");
                    break;

                default:
                    tracer.Tracer(TraceEventType.Warning, "invalid command");
                    Console.WriteLine("Invalid command");
                    break;
                }
            } while (true);
        }
示例#24
0
        private EmitBaseline.MetadataSymbols GetOrCreateMetadataSymbols(EmitBaseline initialBaseline, CSharpCompilation compilation)
        {
            if (initialBaseline.LazyMetadataSymbols != null)
            {
                return(initialBaseline.LazyMetadataSymbols);
            }

            var originalMetadata = initialBaseline.OriginalMetadata;

            // The purpose of this compilation is to provide PE symbols for original metadata.
            // We need to transfer the references from the current source compilation but don't need its syntax trees.
            var metadataCompilation = compilation.RemoveAllSyntaxTrees();

            var metadataAssembly       = metadataCompilation.GetBoundReferenceManager().CreatePEAssemblyForAssemblyMetadata(AssemblyMetadata.Create(originalMetadata), MetadataImportOptions.All);
            var metadataDecoder        = new MetadataDecoder(metadataAssembly.PrimaryModule);
            var metadataAnonymousTypes = GetAnonymousTypeMapFromMetadata(originalMetadata.MetadataReader, metadataDecoder);
            var metadataSymbols        = new EmitBaseline.MetadataSymbols(metadataAnonymousTypes, metadataDecoder);

            return(InterlockedOperations.Initialize(ref initialBaseline.LazyMetadataSymbols, metadataSymbols));
        }
示例#25
0
 /// <summary>
 /// Initializes an instance of <see cref="UpdateManager"/> on the entry assembly.
 /// </summary>
 public UpdateManager(IPackageResolver resolver, IPackageExtractor extractor)
     : this(AssemblyMetadata.FromEntryAssembly(), resolver, extractor)
 {
 }
示例#26
0
        private AssemblyMetadata CompileWithRoslynInMemory(string[] source)
        {
            var srcFileName  = Path.GetFileNameWithoutExtension(this.FirstSource);
            var assemblyName = srcFileName;

            var defineSeparators = new[] { ';', ' ' };
            var syntaxTrees      =
                source.Select(
                    s =>
                    CSharpSyntaxTree.ParseText(
                        SourceText.From(new FileStream(s, FileMode.Open, FileAccess.Read), Encoding.UTF8),
                        new CSharpParseOptions(
                            LanguageVersion.Experimental,
                            preprocessorSymbols: this.Options["DefineConstants"].Split(defineSeparators, StringSplitOptions.RemoveEmptyEntries)),
                        s));

            var assemblies = new List <MetadataImageReference>();

            this.Assemblies = this.LoadReferencesForCompiling(assemblies);

            var options =
                new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary).WithAllowUnsafe(true)
                .WithOptimizations(!this.DebugInfo)
                .WithRuntimeMetadataVersion("4.5");

            var compilation = CSharpCompilation.Create(assemblyName, syntaxTrees, assemblies.ToArray(), options);

            var dllStream = new MemoryStream();
            var pdbStream = new MemoryStream();

            PEModuleBuilder.OnMethodBoundBodySynthesizedDelegate peModuleBuilderOnOnMethodBoundBodySynthesized = (symbol, body) =>
            {
                var key = symbol.ToKeyString();
                Debug.Assert(!this.boundBodyByMethodSymbol.ContainsKey(key), "Check if method is partial");
                this.boundBodyByMethodSymbol[key] = body;
            };

            PEModuleBuilder.OnSourceMethodDelegate peModuleBuilderOnSourceMethod = (symbol, sourceMethod) =>
            {
                var key = symbol.ToKeyString();
                Debug.Assert(!this.sourceMethodByMethodSymbol.ContainsKey(key), "Check if method is partial");
                this.sourceMethodByMethodSymbol[key] = sourceMethod;
            };

            PEModuleBuilder.OnMethodBoundBodySynthesized += peModuleBuilderOnOnMethodBoundBodySynthesized;
            PEModuleBuilder.OnSourceMethod += peModuleBuilderOnSourceMethod;

            var result = compilation.Emit(peStream: dllStream, pdbStream: pdbStream);

            PEModuleBuilder.OnMethodBoundBodySynthesized -= peModuleBuilderOnOnMethodBoundBodySynthesized;
            PEModuleBuilder.OnSourceMethod -= peModuleBuilderOnSourceMethod;

            if (result.Diagnostics.Length > 0)
            {
                var errors = result.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error).ToList();
                Console.WriteLine(@"Errors: {0}", errors.Count);
                foreach (var diagnostic in errors)
                {
                    Console.WriteLine(diagnostic);
                }

                var diagnostics = result.Diagnostics.Where(d => d.Severity != DiagnosticSeverity.Error);
                Console.WriteLine(@"Warnings/Info: {0}", diagnostics.Count());
                foreach (var diagnostic in diagnostics)
                {
                    Console.WriteLine(diagnostic);
                }
            }

            dllStream.Flush();
            dllStream.Position = 0;

            pdbStream.Flush();
            pdbStream.Position = 0;

            // Successful Compile
            return(AssemblyMetadata.CreateFromImageStream(dllStream));
        }
示例#27
0
        public void BadImageFormat()
        {
            var invalidModuleName = Temp.CreateFile().WriteAllBytes(TestResources.MetadataTests.Invalid.InvalidModuleName);

            Assert.Throws <BadImageFormatException>(() => AssemblyMetadata.CreateFromFile(invalidModuleName.Path));
        }
示例#28
0
            public bool GetOrAddMetadata(FileKey key, ValueSource <Optional <AssemblyMetadata> > metadataSource, out AssemblyMetadata metadata)
            {
                lock (_gate)
                {
                    if (TryGetMetadata_NoLock(key, out var cachedMetadata))
                    {
                        metadata = cachedMetadata;
                        return(false);
                    }

                    EnsureCapacity_NoLock();

                    var newMetadata = metadataSource.GetValueOrNull();

                    // the source is expected to keep the metadata alive at this point
                    Contract.ThrowIfNull(newMetadata);

                    // don't use "Add" since key might already exist with already released metadata
                    _metadataCache[key] = metadataSource;
                    metadata            = newMetadata;
                    return(true);
                }
            }
示例#29
0
        public void IncorrectCustomAssemblyTableSize_TooManyMethodSpecs()
        {
            var metadata = AssemblyMetadata.CreateFromImage(TestResources.MetadataTests.Invalid.IncorrectCustomAssemblyTableSize_TooManyMethodSpecs);

            Assert.Throws <BadImageFormatException>(() => metadata.GetModules());
        }
示例#30
0
        /// <summary>
        /// 将模板内容编译并输出内存流
        /// </summary>
        /// <param name="templateSource"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        private static MemoryStream CreateAndCompileToStream(string templateSource, ViewEngineOptions options)
        {
            templateSource = WriteDirectives(templateSource, options);

            var engine = RazorProjectEngine.Create(
                RazorConfiguration.Default,
                RazorProjectFileSystem.Create(@"."),
                (builder) =>
            {
                builder.SetNamespace(options.TemplateNamespace);
            });

            var fileName = Path.GetRandomFileName();

            var document = RazorSourceDocument.Create(templateSource, fileName);

            var codeDocument = engine.Process(
                document,
                null,
                new List <RazorSourceDocument>(),
                new List <TagHelperDescriptor>());

            var razorCSharpDocument = codeDocument.GetCSharpDocument();

            var syntaxTree = CSharpSyntaxTree.ParseText(razorCSharpDocument.GeneratedCode);

            var compilation = CSharpCompilation.Create(
                fileName,
                new[]
            {
                syntaxTree
            },
                options.ReferencedAssemblies
                .Select(ass =>
            {
                // MetadataReference.CreateFromFile(ass.Location)

                unsafe
                {
                    ass.TryGetRawMetadata(out byte *blob, out int length);
                    var moduleMetadata    = ModuleMetadata.CreateFromMetadata((IntPtr)blob, length);
                    var assemblyMetadata  = AssemblyMetadata.Create(moduleMetadata);
                    var metadataReference = assemblyMetadata.GetReference();
                    return(metadataReference);
                }
            })
                .Concat(options.MetadataReferences)
                .ToList(),
                new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            var memoryStream = new MemoryStream();

            var emitResult = compilation.Emit(memoryStream);

            if (!emitResult.Success)
            {
                var errors = emitResult.Diagnostics.ToList();

                var exception = new ViewEngineTemplateException($"Unable to compile template: {errors.FirstOrDefault()}")
                {
                    Errors        = errors,
                    GeneratedCode = razorCSharpDocument.GeneratedCode
                };

                throw exception;
            }

            memoryStream.Position = 0;

            return(memoryStream);
        }
示例#31
0
 public VMAssemblyMetadata(AssemblyBase baseAssembly)
 {
     AssemblyMetadata = new AssemblyMetadata(baseAssembly);
     Namespaces       = baseAssembly.Namespaces?.Select(ns => new NamespaceMetadata(ns));
 }
示例#32
0
        protected void Generate()
        {
            Setup();

            var stringBuilder = new StringBuilder();

            stringBuilder.Append(@"namespace Razor.Orm.Template { 
                        internal static class GeneratedTemplateFactory {");

            foreach (var item in assembly.GetManifestResourceNames())
            {
                var name = item.Replace('.', '_');

                RazorSourceDocument razorSourceDocument = null;

                var stream = new MemoryStream();

                assembly.GetManifestResourceStream(item).CopyTo(stream);

                using (stream)
                    using (var writer = new StreamWriter(stream, Encoding.UTF8))
                    {
                        writer.WriteLine("@using System");
                        writer.WriteLine("@using System");
                        writer.WriteLine("@using System.Collections.Generic");
                        writer.WriteLine("@using System.Linq");
                        writer.WriteLine("@using System.Threading.Tasks");
                        writer.Flush();
                        stream.Position     = 0;
                        razorSourceDocument = RazorSourceDocument.ReadFrom(stream, name, Encoding.UTF8);
                    }

                var razorCodeDocument = RazorCodeDocument.Create(razorSourceDocument);
                engine.Process(razorCodeDocument);
                var generatedCode = razorCodeDocument.GetCSharpDocument().GeneratedCode;
                Parse(generatedCode);

                stringBuilder.Append($@"
                    private static {name}_GeneratedTemplate private_{name}_instance = new {name}_GeneratedTemplate();

                    internal static {name}_GeneratedTemplate {name}_Instance 
                    {{ 
                        get
                        {{
                            return private_{name}_instance;
                        }}
                    }} ");
            }

            stringBuilder.Append(" } }");

            var defaultTemplateFactoryCode = stringBuilder.ToString();

            Parse(defaultTemplateFactoryCode);

            var references = DependencyContext.Load(Assembly.GetEntryAssembly()).CompileLibraries.SelectMany(library => library.ResolveReferencePaths());

            if (!references.Any())
            {
                throw new Exception(Labels.CantLoadMetadataReferenceException);
            }

            var metadataRerefences = new List <MetadataReference>
            {
                AssemblyMetadata.CreateFromFile(assembly.Location).GetReference()
            };

            var libraryPaths = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            foreach (var reference in references)
            {
                if (libraryPaths.Add(reference))
                {
                    using (var stream = File.OpenRead(reference))
                    {
                        metadataRerefences.Add(AssemblyMetadata.Create(ModuleMetadata.CreateFromStream(stream, PEStreamOptions.PrefetchMetadata))
                                               .GetReference(filePath: reference));
                    }
                }
            }

            var compilation = CSharpCompilation.Create(assemblyName)
                              .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
                              .AddReferences(metadataRerefences).AddSyntaxTrees(syntaxTrees);

            using (var assemblyStream = new MemoryStream())
            {
                var result = compilation.Emit(assemblyStream);

                if (!result.Success)
                {
                    var diagnostics = new StringBuilder();

                    diagnostics.AppendLine(Labels.CompileException);

                    foreach (var diagnostic in result.Diagnostics.Where(d => d.IsWarningAsError || d.Severity == DiagnosticSeverity.Error))
                    {
                        var lineSpan = diagnostic.Location.SourceTree.GetMappedLineSpan(diagnostic.Location.SourceSpan);
                        diagnostics.AppendLine($"- ({lineSpan.StartLinePosition.Line}:{lineSpan.StartLinePosition.Character}) {diagnostic.GetMessage()}");
                    }

                    throw new Exception(diagnostics.ToString());
                }

                assemblyStream.Seek(0, SeekOrigin.Begin);

                var generatedAssembly = AssemblyLoadContext.Default.LoadFromStream(assemblyStream);

                foreach (var item in generatedAssembly.GetExportedTypes())
                {
                    GeneratedDao(types.First(e => e.IsAssignableFrom(item)), item);
                }
            }
        }
示例#33
0
        public void CompilationReferences_More()
        {
            string src1 = @"
using System;
class C 
{ 
    public static int F(object a) { return 1; }
    public static void Main() { Console.WriteLine(F(null)); } 
}
";
            string src2 = @"
using System;
class C 
{ 
    public static int F(object a) { return 1; }
    public static void Main() { F(null); }
}
";

            // Let's say an IL rewriter inserts a new overload of F that references
            // a type in a new AssemblyRef.
            string srcPE = @"
using System;
class C 
{ 
    public static int F(System.Diagnostics.Process a) { return 2; }
    public static int F(object a) { return 1; }

    public static void Main() { F(null); }
}
";
            var    md1   = AssemblyMetadata.CreateFromStream(CreateEmptyCompilation(srcPE, new[] { MscorlibRef, SystemRef }).EmitToStream());

            var c1       = CreateEmptyCompilation(src1, new[] { MscorlibRef });
            var c2       = c1.WithSource(src2);
            var baseline = EmitBaseline.CreateInitialBaseline(md1.GetModules()[0], handle => default(EditAndContinueMethodDebugInformation));

            var mdStream       = new MemoryStream();
            var ilStream       = new MemoryStream();
            var pdbStream      = new MemoryStream();
            var updatedMethods = new List <MethodDefinitionHandle>();

            var edits = new[]
            {
                new SemanticEdit(
                    SemanticEditKind.Update,
                    c1.GlobalNamespace.GetMember <NamedTypeSymbol>("C").GetMember("Main"),
                    c2.GlobalNamespace.GetMember <NamedTypeSymbol>("C").GetMember("Main"))
            };

            c2.EmitDifference(baseline, edits, mdStream, ilStream, pdbStream, updatedMethods);

            var actualIL = ImmutableArray.Create(ilStream.ToArray()).GetMethodIL();

            // Symbol matcher should ignore overloads with missing type symbols and match
            // F(object).
            var expectedIL = @"
{
  // Code size        8 (0x8)
  .maxstack  8
  IL_0000:  ldnull
  IL_0001:  call       0x06000002
  IL_0006:  pop
  IL_0007:  ret
}";

            AssertEx.AssertEqualToleratingWhitespaceDifferences(expectedIL, actualIL);
        }
示例#34
0
        public void TestTypetoDocumentNavigation()
        {
            string sourceA = @"
using System;

public partial class C
{
    int x = 1;
}
";

            string sourceB = @"
using System;

public partial class C
{
    int y = 1;

    public void F2()
    {
#line 1 ""a.txt""
        int z = 1;
#line default
    } 
}
";
            var    c1      = CreateCompilation(new[]
            {
                SyntaxFactory.ParseSyntaxTree(sourceA, path: "X.cs", encoding: Encoding.UTF8),
                SyntaxFactory.ParseSyntaxTree(sourceB, path: "Z.cs", encoding: Encoding.UTF8)
            }, options: TestOptions.DebugDll);

            var pdbStream = new MemoryStream();
            var peImage   = c1.EmitToArray(EmitOptions.Default.WithDebugInformationFormat(DebugInformationFormat.PortablePdb), pdbStream: pdbStream);

            pdbStream.Position = 0;

            string source2           = @"
using System;

public class Program
{
    public static void Main() { }   
}
";
            var    assemblyMetadata  = AssemblyMetadata.CreateFromImage(peImage);
            var    metadataReference = assemblyMetadata.GetReference();
            var    c2 = CreateCompilation(new[] { source2 }, new[] { metadataReference }, options: TestOptions.DebugDll);

            var    typeC  = c2.GetTypeByMetadataName("C");
            Symbol symbol = typeC.GetMethod("F2");

            //symbol = (PEMethodSymbol)symbol;
            using var provider = MetadataReaderProvider.FromPortablePdbStream(pdbStream);
            var pdbReader = provider.GetMetadataReader();
            var docList   = FindSourceDocuments(symbol, pdbReader);

            Assert.Equal(0x30000002, MetadataTokens.GetToken(docList[0]));

            // go through all methods and collect documents.
        }
示例#35
0
        public void CompilationReferences_Less()
        {
            // Add some references that are actually not used in the source.
            // The only actual reference stored in the metadata image would be: mscorlib (rowid 1).
            // If we incorrectly assume the references are the same we will map TypeRefs of
            // Mscorlib to System.Windows.Forms.
            var references = new[] { SystemWindowsFormsRef, MscorlibRef, SystemCoreRef };

            string src1 = @"
using System;
using System.Threading.Tasks;

class C 
{ 
    public Task<int> F() { Console.WriteLine(123); return null; }
    public static void Main() { Console.WriteLine(1); } 
}
";
            string src2 = @"
using System;
using System.Threading.Tasks;

class C 
{ 
    public Task<int> F() { Console.WriteLine(123); return null; }
    public static void Main() { Console.WriteLine(2); }
}
";

            var c1       = CreateEmptyCompilation(src1, references);
            var c2       = c1.WithSource(src2);
            var md1      = AssemblyMetadata.CreateFromStream(c1.EmitToStream());
            var baseline = EmitBaseline.CreateInitialBaseline(md1.GetModules()[0], handle => default(EditAndContinueMethodDebugInformation));

            var mdStream       = new MemoryStream();
            var ilStream       = new MemoryStream();
            var pdbStream      = new MemoryStream();
            var updatedMethods = new List <MethodDefinitionHandle>();

            var edits = new[]
            {
                new SemanticEdit(
                    SemanticEditKind.Update,
                    c1.GlobalNamespace.GetMember <NamedTypeSymbol>("C").GetMember("Main"),
                    c2.GlobalNamespace.GetMember <NamedTypeSymbol>("C").GetMember("Main"))
            };

            c2.EmitDifference(baseline, edits, mdStream, ilStream, pdbStream, updatedMethods);

            var actualIL   = ImmutableArray.Create(ilStream.ToArray()).GetMethodIL();
            var expectedIL = @"
{
  // Code size        7 (0x7)
  .maxstack  8
  IL_0000:  ldc.i4.2
  IL_0001:  call       0x0A000006
  IL_0006:  ret
}";

            // If the references are mismatched then the symbol matcher won't be able to find Task<T>
            // and will recompile the method body of F (even though the method hasn't changed).
            AssertEx.AssertEqualToleratingWhitespaceDifferences(expectedIL, actualIL);
        }
        /// <summary>
        /// Reqursively goes through all namespaces in the assembly and discovers unique types, extensions and namespaces.
        /// </summary>
        private void ProcessNamespace(AssemblyMetadata assembly, INamespaceSymbol namespaceSymbol)
        {
            var assemblyName = Path.GetFileName(assembly.FullPath);
            if (string.IsNullOrEmpty(assemblyName) || namespaceSymbol == null)
            {
                return;
            }

            var fullNamespaceName = (namespaceSymbol.ContainingNamespace == null || string.IsNullOrEmpty(namespaceSymbol.ContainingNamespace.Name))
                    ? namespaceSymbol.Name
                    : namespaceSymbol.ContainingNamespace + "." + namespaceSymbol.Name;

            foreach (var typeName in namespaceSymbol.GetTypeMembers())
            {
                try
                {
                    // keep only public types
                    if (typeName.DeclaredAccessibility != Accessibility.Public)
                    {
                        continue;
                    }

                    var typeFullName = string.IsNullOrEmpty(fullNamespaceName)
                                        ? typeName.Name
                                        : typeName.ContainingNamespace + "." + typeName.Name;

                    // if we meet this type first time - remember it
                    if (!_types.ContainsKey(typeFullName))
                    {
                        var newType = new TypeModel
                        {
                            Name = typeName.Name,
                            FullName = typeFullName,
                            AssemblyName = assemblyName,
                            PackageName = _package.Id,
                            PackageVersion = _package.Version
                        };
                        newType.TargetFrameworks.AddRange(assembly.TargetFrameworks);

                        _types.Add(typeFullName, newType);

                        // if namespace contains at least one type and we meet this namespace first time - remember it
                        if (!string.IsNullOrEmpty(fullNamespaceName) && !_namespaces.ContainsKey(fullNamespaceName))
                        {
                            var newNamespace = new NamespaceModel
                            {
                                Name = fullNamespaceName,
                                AssemblyName = assemblyName,
                                PackageName = _package.Id,
                                PackageVersion = _package.Version
                            };
                            newNamespace.TargetFrameworks.AddRange(assembly.TargetFrameworks);

                            _namespaces.Add(fullNamespaceName, newNamespace);
                        }
                        else
                        {
                            var namespaceModel = _namespaces[fullNamespaceName];
                            namespaceModel.MergeTargetFrameworks(assembly.TargetFrameworks);
                        }
                    }
                    else
                    {
                        var typeModel = _types[typeFullName];
                        typeModel.MergeTargetFrameworks(assembly.TargetFrameworks);

                        if (!string.IsNullOrEmpty(fullNamespaceName))
                        {
                            var namespaceModel = _namespaces[fullNamespaceName];
                            namespaceModel.MergeTargetFrameworks(assembly.TargetFrameworks);
                        }
                    }

                    // if type is static, then it might contain extension methdos 
                    if (typeName.IsStatic)
                    {
                        foreach (var member in typeName.GetMembers())
                        {
                            // proceed only if static type's member is a method and it is public
                            var method = member as IMethodSymbol;
                            if (method == null || method.DeclaredAccessibility != Accessibility.Public)
                            {
                                continue;
                            }

                            if (method.IsExtensionMethod)
                            {
                                var thisParameter = method.Parameters[0];
                                var extensionMethodTypeName = thisParameter.Type.ContainingNamespace + "." + thisParameter.Type.Name;
                                var extensionFullName = extensionMethodTypeName + "." + method.Name;

                                // if we meet this extension first time - remember it
                                if (!_extensions.ContainsKey(extensionFullName))
                                {
                                    var newExtension = new ExtensionModel
                                    {
                                        Name = method.Name,
                                        FullName = extensionFullName,
                                        AssemblyName = assemblyName,
                                        PackageName = _package.Id,
                                        PackageVersion = _package.Version,
                                        Namespace = fullNamespaceName
                                    };
                                    newExtension.TargetFrameworks.AddRange(assembly.TargetFrameworks);

                                    _extensions.Add(extensionFullName, newExtension);
                                }
                                else
                                {
                                    var extensionModel = _extensions[extensionFullName];
                                    extensionModel.MergeTargetFrameworks(assembly.TargetFrameworks);
                                }
                            }
                        }
                    }
                }
                catch(Exception e)
                {
                    Debug.Write(e.ToString());
                }
            }

            // recurse to chilren namespaces
            foreach (var childNamespace in namespaceSymbol.GetNamespaceMembers())
            {
                if (childNamespace.NamespaceKind == NamespaceKind.Module)
                {
                    ProcessNamespace(assembly, childNamespace);
                }
            }
        }
示例#37
0
 public AssemblyTreeViewItem(AssemblyMetadata assemblyMetadata) : base()
 {
     this.assemblyMetadata = assemblyMetadata;
     Name = assemblyMetadata.Name;
 }
示例#38
0
        /// <summary>
        /// </summary>
        /// <param name="assemblyMetadata">
        /// </param>
        /// <returns>
        /// </returns>
        private AssemblySymbol LoadAssemblySymbol(AssemblyMetadata assemblyMetadata)
        {
            AssemblySymbol symbol;
            if (this.cache.TryGetValue(assemblyMetadata.Assembly.Identity, out symbol))
            {
                return symbol;
            }

            var assemblySymbol = GetAssemblySymbol(assemblyMetadata);

            this.cache[assemblyMetadata.Assembly.Identity] = assemblySymbol;
            this.unifiedAssemblies.Add(new UnifiedAssembly<AssemblySymbol>(assemblySymbol, assemblyMetadata.Assembly.Identity));

            var moduleReferences = this.LoadReferences(assemblyMetadata);
            foreach (var module in assemblySymbol.Modules)
            {
                module.SetReferences(moduleReferences);
            }

            this.SetCorLib(assemblySymbol);

            return assemblySymbol;
        }
        public void TypeOutsideModule()
        {
            var sourceA =
                @"using System;
public class A<T>
{
    public static void M(Action f)
    {
        object o;
        try
        {
            f();
        }
        catch (Exception)
        {
        }
    }
}";
            var sourceB =
                @"using System;
class E : Exception
{
    internal object F;
}
class B
{
    static void Main()
    {
        A<int>.M(() => { throw new E(); });
    }
}";
            var assemblyNameA = "0A93FF0B-31A2-47C8-B24D-16A2D77AB5C5";
            var compilationA  = CreateCompilationWithMscorlib(sourceA, options: TestOptions.DebugDll, assemblyName: assemblyNameA);

            byte[] exeA;
            byte[] pdbA;
            ImmutableArray <MetadataReference> referencesA;

            compilationA.EmitAndGetReferences(out exeA, out pdbA, out referencesA);
            var metadataA  = AssemblyMetadata.CreateFromImage(exeA);
            var referenceA = metadataA.GetReference();

            var assemblyNameB = "9BAC6622-86EB-4EC5-94A1-9A1E6D0C24B9";
            var compilationB  = CreateCompilationWithMscorlib(sourceB, options: TestOptions.DebugExe, references: new[] { referenceA }, assemblyName: assemblyNameB);

            byte[] exeB;
            byte[] pdbB;
            ImmutableArray <MetadataReference> referencesB;

            compilationB.EmitAndGetReferences(out exeB, out pdbB, out referencesB);
            var metadataB  = AssemblyMetadata.CreateFromImage(exeB);
            var referenceB = metadataB.GetReference();

            var modulesBuilder = ArrayBuilder <ModuleInstance> .GetInstance();

            modulesBuilder.Add(MscorlibRef.ToModuleInstance(fullImage: null, symReader: null));
            modulesBuilder.Add(referenceA.ToModuleInstance(fullImage: exeA, symReader: new SymReader(pdbA)));
            modulesBuilder.Add(referenceB.ToModuleInstance(fullImage: exeB, symReader: new SymReader(pdbB)));
            modulesBuilder.Add(ExpressionCompilerTestHelpers.IntrinsicAssemblyReference.ToModuleInstance(fullImage: null, symReader: null));

            using (var runtime = new RuntimeInstance(modulesBuilder.ToImmutableAndFree()))
            {
                var context = CreateMethodContext(
                    runtime,
                    "A.M");
                var aliases = ImmutableArray.Create(
                    ExceptionAlias("E, 9BAC6622-86EB-4EC5-94A1-9A1E6D0C24B9, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"),
                    ObjectIdAlias(1, "A`1[[B, 9BAC6622-86EB-4EC5-94A1-9A1E6D0C24B9, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], 0A93FF0B-31A2-47C8-B24D-16A2D77AB5C5, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"));
                string error;
                var    testData = new CompilationTestData();
                context.CompileExpression(
                    "$exception",
                    DkmEvaluationFlags.TreatAsExpression,
                    aliases,
                    out error,
                    testData);
                Assert.Null(error);
                testData.GetMethodData("<>x<T>.<>m0").VerifyIL(
                    @"{
  // Code size       11 (0xb)
  .maxstack  1
  .locals init (object V_0) //o
  IL_0000:  call       ""System.Exception Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetException()""
  IL_0005:  castclass  ""E""
  IL_000a:  ret
}");
                ResultProperties resultProperties;
                ImmutableArray <AssemblyIdentity> missingAssemblyIdentities;
                testData = new CompilationTestData();
                context.CompileAssignment(
                    "o",
                    "$1",
                    aliases,
                    DiagnosticFormatter.Instance,
                    out resultProperties,
                    out error,
                    out missingAssemblyIdentities,
                    EnsureEnglishUICulture.PreferredOrNull,
                    testData);
                Assert.Empty(missingAssemblyIdentities);
                Assert.Null(error);
                testData.GetMethodData("<>x<T>.<>m0").VerifyIL(
                    @"{
  // Code size       17 (0x11)
  .maxstack  1
  .locals init (object V_0) //o
  IL_0000:  ldstr      ""$1""
  IL_0005:  call       ""object Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetObjectByAlias(string)""
  IL_000a:  castclass  ""A<B>""
  IL_000f:  stloc.0
  IL_0010:  ret
}");
            }
        }
示例#40
0
        /// <summary>
        /// </summary>
        /// <param name="assemblyMetadata">
        /// </param>
        /// <returns>
        /// </returns>
        public IEnumerable<string> AllReferencesHelper(AssemblyMetadata assemblyMetadata)
        {
            yield return assemblyMetadata.Assembly.Identity.Name;

            foreach (var reference in this.LoadReferences(assemblyMetadata).Names)
            {
                foreach (var referenceName in this.AllReferencesHelper(this.GetAssemblyMetadata(reference)))
                {
                    yield return referenceName;
                }
            }
        }
示例#41
0
        public static void Compile(string code, bool isDebug, out Assembly compiledAssembly, out IList <string> errors, out IList <string> warnings)
        {
            var assemblyName = "CodeGenerationAssembly" + Interlocked.Increment(ref _suffix);
            var metadataList =
                SerializerDebugging.CodeSerializerDependentAssemblies.Select(
                    a =>
                    a is string
                    ?AssemblyMetadata.CreateFromFile(a as string)
                        : AssemblyMetadata.CreateFromImage(a as byte[])
                    ).ToArray();

            try
            {
                var compilation =
                    CSharpCompilation.Create(
                        assemblyName,
                        new[] { CSharpSyntaxTree.ParseText(code) },
                        metadataList.Select(m => m.GetReference()),
                        new CSharpCompilationOptions(
                            OutputKind.DynamicallyLinkedLibrary,
                            optimizationLevel: isDebug?OptimizationLevel.Debug: OptimizationLevel.Release,
                            // Suppress CS0436 because gen/*.cs will conflict with testing serializers.
                            specificDiagnosticOptions: new[] { new KeyValuePair <string, ReportDiagnostic>("CS0436", ReportDiagnostic.Suppress) }
                            )
                        );

                var        emitOptions = new EmitOptions(runtimeMetadataVersion: "v4.0.30319");
                EmitResult result;
                if (SerializerDebugging.DumpEnabled)
                {
                    var assemblyPath = Path.Combine(SerializerDebugging.DumpDirectory ?? Path.GetTempPath(), assemblyName + ".dll");

                    using (var fileStream = File.OpenWrite(assemblyPath))
                    {
                        result = compilation.Emit(fileStream, options: emitOptions);
                        fileStream.Flush();
                    }

                    if (result.Success)
                    {
                        compiledAssembly = Assembly.LoadFrom(assemblyPath);
                        SerializerDebugging.AddCompiledCodeAssembly(assemblyPath);
                    }
                    else
                    {
                        compiledAssembly = null;
                    }
                }
                else
                {
                    using (var buffer = new MemoryStream())
                    {
                        result = compilation.Emit(buffer, options: emitOptions);
                        if (result.Success)
                        {
                            var image = buffer.ToArray();
                            compiledAssembly = Assembly.Load(image);
                            SerializerDebugging.AddCompiledCodeAssembly(assemblyName, image);
                        }
                        else
                        {
                            compiledAssembly = null;
                        }
                    }
                }

                errors   = BuildCompilationError(result.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error));
                warnings = BuildCompilationError(result.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Warning));
            }
            finally
            {
                foreach (var metadata in metadataList)
                {
                    metadata.Dispose();
                }
            }
        }
        public void Load(string fileName)
        {
            Stream fs = System.IO.File.OpenRead(fileName);
            fs.Seek(128, SeekOrigin.Begin);

            filename = fileName;

            BinaryReader binaryReader = new BinaryReader(fs);

            header = new PEFileHeader();
            header.LoadFrom(binaryReader);

            sections = new SectionTable[header.NumberOfSections];
            for (int i = 0; i < header.NumberOfSections; ++i) {
                sections[i] = new SectionTable();
                sections[i].LoadFrom(binaryReader);
            }

            uint rawDataSize = 0;
            for (int i = 0; i < header.NumberOfSections; ++i) {
                rawDataSize += sections[i].SizeOfRawData;
            }

            // read all sections to a memory buffer and relocate all pointer in the sections
            // to raw data indices in the buffer
            rawSectionData = new byte[rawDataSize];
            int curOffset = 0;
            for (int i = 0; i < header.NumberOfSections; ++i) {
                fs.Seek((int)sections[i].PointerToRawData, SeekOrigin.Begin);
                fs.Read(rawSectionData, curOffset, (int)sections[i].SizeOfRawData);
                sections[i].PointerToRawData = (uint)curOffset;
                curOffset += (int)sections[i].SizeOfRawData;
            }
            binaryReader.Close();
            fs.Close();

            fs           = new MemoryStream(rawSectionData);
            binaryReader = new BinaryReader(fs);

            uint cliHeaderPos = LookupRVA(header.DataDirectories.CliHeader);
            fs.Seek((int)cliHeaderPos, SeekOrigin.Begin);
            cliHeader = new CLIHeader();
            cliHeader.LoadFrom(binaryReader);

            uint metaDataPos = LookupRVA(cliHeader.MetaData);
            fs.Seek((int)metaDataPos, SeekOrigin.Begin);
            AssemblyMetadata met = new AssemblyMetadata();
            met.LoadFrom(binaryReader);

            foreach (StreamHeader streamHeader in met.StreamHeaders) {
                uint offset = LookupRVA(cliHeader.MetaData + streamHeader.Offset);
                fs.Seek((int)offset, SeekOrigin.Begin);
                switch (streamHeader.Name) {
                    case "#~":
                        metadataTable.LoadFrom(binaryReader);
                        break;
                    case "#Strings":
                        stringHeap = new byte[streamHeader.Size];
                        fs.Read(stringHeap, 0, stringHeap.Length);
                        break;
                    case "#US":
                        userStringHeap = new byte[streamHeader.Size];
                        fs.Read(userStringHeap, 0, userStringHeap.Length);
                        break;
                    case "#GUID":
                        guidHeap = new byte[streamHeader.Size];
                        fs.Read(guidHeap, 0, guidHeap.Length);
                        break;
                    case "#Blob":
                        blobHeap = new byte[streamHeader.Size];
                        fs.Read(blobHeap, 0, blobHeap.Length);
                        break;
                }
            }
        }
示例#43
0
        private void ConfigureHostSetupForAssembly(HostSetup hostSetup, string assemblyPath, AssemblyMetadata assemblyMetadata)
        {
            string assemblyDir = Path.GetDirectoryName(assemblyPath);

            if (hostSetup.ApplicationBaseDirectory == null)
                hostSetup.ApplicationBaseDirectory = assemblyDir;

            if (hostSetup.WorkingDirectory == null)
                hostSetup.WorkingDirectory = assemblyDir;

            hostSetup.ConfigurationFileLocation = ConfigurationFileLocation.AppBase;

            string assemblyConfigFilePath = assemblyPath + @".config";
            if (File.Exists(assemblyConfigFilePath))
            {
                string configurationXml = File.ReadAllText(assemblyConfigFilePath);
                hostSetup.Configuration.ConfigurationXml = configurationXml;

                if (hostSetup.RuntimeVersion == null)
                    hostSetup.RuntimeVersion = GetPreferredRuntimeVersion(configurationXml);
            }

            foreach (AssemblyBinding assemblyBinding in RuntimeAccessor.Instance.GetAllPluginAssemblyBindings())
            {
                if (assemblyBinding.CodeBase != null)
                    hostSetup.Configuration.AddAssemblyBinding(assemblyBinding);
            }

            if (hostSetup.ProcessorArchitecture == ProcessorArchitecture.None
                || hostSetup.ProcessorArchitecture == ProcessorArchitecture.MSIL)
                hostSetup.ProcessorArchitecture = assemblyMetadata.ProcessorArchitecture;

            if (hostSetup.RuntimeVersion == null)
                hostSetup.RuntimeVersion = assemblyMetadata.RuntimeVersion;

            ConfigureHostSetupForAssembly(hostSetup, assemblyPath);
        }