internal static List<IAssemblyReference> ToAssemblyReferences(IEnumerable<AssemblyDefinition> references) { var list = new List<IAssemblyReference>(); if (references == null) { return list; } foreach (var reference in references) { var loader = new CecilLoader(); loader.IncludeInternalMembers = true; list.Add(loader.LoadAssembly(reference)); } return list; }
IList<IUnresolvedAssembly> LoadAssemblies() { var resolver = new AssemblyResolver(); foreach (var path in fileNames.Select(f => Path.GetDirectoryName(f)).Distinct(StringComparer.OrdinalIgnoreCase)) resolver.AddSearchDirectory(path); List<AssemblyDefinition> assemblies = new List<AssemblyDefinition>(); foreach (var file in fileNames.Distinct(StringComparer.OrdinalIgnoreCase)) assemblies.Add(resolver.LoadAssemblyFile(file)); foreach (var asm in assemblies.ToArray()) assemblies.AddRange(asm.Modules.SelectMany(m => m.AssemblyReferences).Select(r => resolver.TryResolve(r)).Where(r => r != null)); CecilLoader loader = new CecilLoader { IncludeInternalMembers = true }; // Emulate the old CecilLoader.GetCecilObject() API: loader.OnEntityLoaded = delegate(IUnresolvedEntity entity, MemberReference cecilObj) { unresolvedTypeSystemToCecilDict[entity] = cecilObj; }; var loadedAssemblies = new List<IUnresolvedAssembly>(); foreach (var asm in assemblies.Distinct()) { var loadedAssembly = loader.LoadAssembly(asm); loadedAssemblies.Add(loadedAssembly); unresolvedTypeSystemToCecilDict[loadedAssembly] = asm; } return loadedAssemblies; }
private static IEnumerable<IAssemblyReference> LoadReferences(IEnumerable<string> references, IErrorReporter er) { var loader = new CecilLoader { IncludeInternalMembers = true }; var assemblies = references.Select(r => AssemblyDefinition.ReadAssembly(r)).ToList(); // Shouldn't result in errors because mcs would have caught it. var indirectReferences = ( from a in assemblies from m in a.Modules from r in m.AssemblyReferences select r.Name) .Distinct(); var directReferences = from a in assemblies select a.Name.Name; var missingReferences = indirectReferences.Except(directReferences).ToList(); if (missingReferences.Count > 0) { er.Region = DomRegion.Empty; foreach (var r in missingReferences) er.Message(7996, r); return null; } return assemblies.Select(a => loader.LoadAssembly(a)).ToList(); }
/// <summary> /// Public translation interface. /// Translates the given method to HLSL /// </summary> /// <param name="s">Shader type definition.</param> /// <param name="m">A method representing a shader to translate.</param> /// <param name="attr">The shader type as attribute (either FragmentShaderAttribute or VertexShaderAttribute</param> /// <param name="type">The shader type as ShaderType</param> /// <returns>The translated GLSL shader source</returns> public FunctionDescription Transform(TypeDefinition s, MethodDefinition m, CustomAttribute attr, ShaderType type) { if (s == null) throw new ArgumentNullException("s"); if (m == null) throw new ArgumentNullException("m"); if (attr == null) throw new ArgumentNullException("attr"); var sbase = s.BaseType.Resolve(); while (sbase.MetadataToken.ToInt32() != typeof(Shader).MetadataToken) sbase = sbase.BaseType.Resolve(); var dctx = new DecompilerContext(s.Module) { CurrentType = s, CurrentMethod = m, CancellationToken = CancellationToken.None }; var d = AstMethodBodyBuilder.CreateMethodBody(m, dctx); //var ctx = new CecilTypeResolveContext(sbase.Module); var loader = new CecilLoader(); var mscorlib = loader.LoadAssemblyFile(typeof(object).Assembly.Location); var slsharp = loader.LoadAssembly(sbase.Module.Assembly); var project = loader.LoadAssembly(s.Module.Assembly); var ctx = new CompositeTypeResolveContext(new[] { project, slsharp, mscorlib }); var resolver = new CSharpResolver(ctx, CancellationToken.None) {UsingScope = new UsingScope(project)}; /* foreach (var v in m.Body.Variables) { resolver.AddVariable(v.VariableType, null, v.Name) }*/ //resolver.AddVariable() //resolver.LocalVariables = m.Body.Variables; // TODO: need a more sane way to get the correct class + member var ss = ctx.GetAllTypes().First(c => c.FullName == s.FullName); resolver.CurrentTypeDefinition = ss; resolver.CurrentMember = ss.Methods.First(n => SameMethod(m, n, ctx)); var rv = new ResolveVisitor(resolver, new ParsedFile("memory", resolver.UsingScope), null); var glsl = new HlslVisitor(d, attr, rv, dctx); _functions.UnionWith(glsl.Functions); var entry = (bool)attr.ConstructorArguments.FirstOrDefault().Value; var sig = HlslVisitor.GetSignature(m); var code = glsl.Result; var desc = new FunctionDescription(Shader.GetMethodName(m), sig + code, entry, type); _dependencies.UnionWith(glsl.Dependencies); return desc; }