public static bool ContainsReferenceToSystemRuntime(string fileName) { lock (referenceLock) { bool result; if (referenceDict.TryGetValue(fileName, out result)) { return(result); } //const int cacheLimit = 4096; //if (referenceDict.Count > cacheLimit) // referenceDict = ImmutableDictionary<string, bool>.Empty using (var universe = new IKVM.Reflection.Universe()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile(fileName); } catch { return(false); } foreach (var r in assembly.GetReferencedAssemblies()) { if (r.FullName.Equals("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")) { referenceDict = referenceDict.SetItem(fileName, true); return(true); } } } referenceDict = referenceDict.SetItem(fileName, false); return(false); } }
/// <summary> /// Simply get all assembly manifest resources from an assembly given it's file name. /// </summary> public static IEnumerable <ManifestResource> GetAssemblyManifestResources(string fileName) { using (var universe = new IKVM.Reflection.Universe()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile(fileName); } catch { yield break; } foreach (var _r in assembly.GetManifestResourceNames()) { var r = _r; yield return(new ManifestResource(r, () => assembly.GetManifestResourceStream(r))); } } /* CECIL version: * * Mono.Cecil.AssemblyDefinition a = Mono.Cecil.AssemblyDefinition.ReadAssembly (asmInBundle); * foreach (Mono.Cecil.ModuleDefinition m in a.Modules) { * for (int i = 0; i < m.Resources.Count; i++) { * var er = m.Resources[i] as Mono.Cecil.EmbeddedResource; * * yield return new ManifestResource (er.Name, () => er.GetResourceStream ().ReadToEnd ()); * } * }*/ }
ParserResult <IKVM.Reflection.Assembly> ParseAssembly(ProjectInput input) { var result = new ParserResult <IKVM.Reflection.Assembly> { Input = input }; if (!File.Exists(input.FullPath)) { result.Kind = ParserResultKind.FileNotFound; return(result); } try { var res = Universe.LoadFile(input.FullPath); result.Output = res; } catch (Exception ex) { result.Message = ex.ToString(); result.Kind = ParserResultKind.Error; } finally { OnAssemblyParsed(result); } return(result); }
/// <summary> /// Simply get all assembly reference names from an assembly given it's file name. /// </summary> public static IEnumerable <string> GetAssemblyReferences(string fileName) { using (var universe = new IKVM.Reflection.Universe()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile(fileName); } catch { yield break; } foreach (var r in assembly.GetReferencedAssemblies()) { yield return(r.Name); } } /* CECIL version: * * Mono.Cecil.AssemblyDefinition adef; * try { * adef = Mono.Cecil.AssemblyDefinition.ReadAssembly (fileName); * } catch { * yield break; * } * foreach (Mono.Cecil.AssemblyNameReference aref in adef.MainModule.AssemblyReferences) { * yield return aref.Name; * }*/ }
//FIXME: this is totally broken. assemblies can't just belong to one framework public TargetFrameworkMoniker GetTargetFrameworkForAssembly(TargetRuntime tr, string file) { var universe = new IKVM.Reflection.Universe(); universe.EnableMissingMemberResolution(); try { IKVM.Reflection.Assembly assembly = universe.LoadFile(file); var att = assembly.CustomAttributes.FirstOrDefault(a => a.AttributeType.FullName == "System.Runtime.Versioning.TargetFrameworkAttribute" ); if (att != null) { if (att.ConstructorArguments.Count == 1) { var v = att.ConstructorArguments[0].Value as string; TargetFrameworkMoniker m; if (v != null && TargetFrameworkMoniker.TryParse(v, out m)) { return(m); } } LoggingService.LogError("Invalid TargetFrameworkAttribute in assembly {0}", file); } foreach (var r in assembly.GetReferencedAssemblies()) { if (r.Name == "mscorlib") { TargetFramework compatibleFramework = null; // If there are several frameworks that can run the file, pick one that is installed foreach (TargetFramework tf in GetKnownFrameworks()) { if (tf.GetCorlibVersion() == r.Version.ToString()) { compatibleFramework = tf; if (tr.IsInstalled(tf)) { return(tf.Id); } } } if (compatibleFramework != null) { return(compatibleFramework.Id); } break; } } } catch (Exception ex) { LoggingService.LogError("Error to determine target framework for assembly {0}: {1}", file, ex); return(TargetFrameworkMoniker.UNKNOWN); } finally { universe.Dispose(); } LoggingService.LogError("Failed to determine target framework for assembly {0}", file); return(TargetFrameworkMoniker.UNKNOWN); }
private IKVM.Reflection.Assembly ResolveNewAssembly(IKVM.Reflection.Universe uni, string fileName) { foreach (var match in ProbeForFiles(fileName)) { var asm = uni.LoadFile(match); if (asm != null) { Console.WriteLine("Resolved " + match); return(asm); } } return(null); }
/// <summary> /// Simply get all assembly reference names from an assembly given it's file name. /// </summary> public static IEnumerable <string> GetAssemblyReferences(string fileName) { using (var universe = new IKVM.Reflection.Universe()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile(fileName); } catch { yield break; } foreach (var r in assembly.GetReferencedAssemblies()) { yield return(r.Name); } } }
/// <summary> /// Simply get all assembly manifest resources from an assembly given it's file name. /// </summary> public static IEnumerable <ManifestResource> GetAssemblyManifestResources(string fileName) { using (var universe = new IKVM.Reflection.Universe()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile(fileName); } catch { yield break; } foreach (var _r in assembly.GetManifestResourceNames()) { var r = _r; yield return(new ManifestResource(r, () => assembly.GetManifestResourceStream(r))); } } }
public static bool ContainsReferenceToSystemRuntime(string fileName) { using (var universe = new IKVM.Reflection.Universe()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile(fileName); } catch { return(false); } foreach (var r in assembly.GetReferencedAssemblies()) { if (r.FullName.Equals("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")) { return(true); } } } return(false); }
public void ParseAssembly(ProjectInput input, ParserResult <IKVM.Reflection.Assembly> result) { try { try { var res = Universe.LoadFile(input.FullPath); result.Output = res; } catch (Exception ex) { result.Message = ex.ToString(); result.Kind = ParserResultKind.Error; } } finally { OnAssemblyParsed(result); } }
/// <summary> /// Get the Mono executable best matching the assembly architecture flags. /// </summary> /// <remarks>Returns a fallback Mono executable, if a match cannot be found.</remarks> /// <returns>The Mono executable that should be used to execute the assembly.</returns> /// <param name="assemblyPath">Assembly path.</param> public string GetMonoExecutableForAssembly(string assemblyPath) { IKVM.Reflection.PortableExecutableKinds peKind; IKVM.Reflection.ImageFileMachine machine; using (var universe = new IKVM.Reflection.Universe()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile(assemblyPath); assembly.ManifestModule.GetPEKind(out peKind, out machine); } catch { peKind = IKVM.Reflection.PortableExecutableKinds.ILOnly; machine = IKVM.Reflection.ImageFileMachine.I386; } } string monoPath; if ((peKind & (IKVM.Reflection.PortableExecutableKinds.Required32Bit | IKVM.Reflection.PortableExecutableKinds.Preferred32Bit)) != 0) { monoPath = Path.Combine(MonoRuntimeInfo.Prefix, "bin", "mono32"); if (File.Exists(monoPath)) { return(monoPath); } } else if ((peKind & IKVM.Reflection.PortableExecutableKinds.PE32Plus) != 0) { monoPath = Path.Combine(MonoRuntimeInfo.Prefix, "bin", "mono64"); if (File.Exists(monoPath)) { return(monoPath); } } return(monoPath = Path.Combine(MonoRuntimeInfo.Prefix, "bin", "mono")); }
/// <summary> /// Simply get all assembly manifest resources from an assembly given it's file name. /// </summary> public static IEnumerable<ManifestResource> GetAssemblyManifestResources (string fileName) { using (var universe = new IKVM.Reflection.Universe ()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile (fileName); } catch { yield break; } foreach (var _r in assembly.GetManifestResourceNames ()) { var r = _r; yield return new ManifestResource (r, () => assembly.GetManifestResourceStream (r)); } } }
public static bool ContainsReferenceToSystemRuntime (string fileName) { lock (referenceLock) { bool result; if (referenceDict.TryGetValue (fileName, out result)) return result; //const int cacheLimit = 4096; //if (referenceDict.Count > cacheLimit) // referenceDict = ImmutableDictionary<string, bool>.Empty using (var universe = new IKVM.Reflection.Universe ()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile (fileName); } catch { return false; } foreach (var r in assembly.GetReferencedAssemblies ()) { if (r.FullName.Equals ("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")) { referenceDict = referenceDict.SetItem (fileName, true); return true; } } } referenceDict = referenceDict.SetItem (fileName, false); return false; } }
/// <summary> /// Simply get all assembly reference names from an assembly given it's file name. /// </summary> public static IEnumerable<string> GetAssemblyReferences (string fileName) { using (var universe = new IKVM.Reflection.Universe ()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile (fileName); } catch { yield break; } foreach (var r in assembly.GetReferencedAssemblies ()) { yield return r.Name; } } }
//FIXME: this is totally broken. assemblies can't just belong to one framework public TargetFrameworkMoniker GetTargetFrameworkForAssembly (TargetRuntime tr, string file) { var universe = new IKVM.Reflection.Universe (); universe.EnableMissingMemberResolution (); try { IKVM.Reflection.Assembly assembly = universe.LoadFile (file); var att = assembly.CustomAttributes.FirstOrDefault (a => a.AttributeType.FullName == "System.Runtime.Versioning.TargetFrameworkAttribute" ); if (att != null) { if (att.ConstructorArguments.Count == 1) { var v = att.ConstructorArguments[0].Value as string; TargetFrameworkMoniker m; if (v != null && TargetFrameworkMoniker.TryParse (v, out m)) { return m; } } LoggingService.LogError ("Invalid TargetFrameworkAttribute in assembly {0}", file); } foreach (var r in assembly.GetReferencedAssemblies ()) { if (r.Name == "mscorlib") { TargetFramework compatibleFramework = null; // If there are several frameworks that can run the file, pick one that is installed foreach (TargetFramework tf in GetKnownFrameworks ()) { if (tf.GetCorlibVersion () == r.Version.ToString ()) { compatibleFramework = tf; if (tr.IsInstalled (tf)) return tf.Id; } } if (compatibleFramework != null) return compatibleFramework.Id; break; } } } catch (Exception ex) { LoggingService.LogError ("Error to determine target framework for assembly {0}: {1}", file, ex); return TargetFrameworkMoniker.UNKNOWN; } finally { universe.Dispose (); } LoggingService.LogError ("Failed to determine target framework for assembly {0}", file); return TargetFrameworkMoniker.UNKNOWN; }
/// <summary> /// Simply get all assembly manifest resources from an assembly given it's file name. /// </summary> public static IEnumerable<ManifestResource> GetAssemblyManifestResources (string fileName) { using (var universe = new IKVM.Reflection.Universe ()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile (fileName); } catch { yield break; } foreach (var _r in assembly.GetManifestResourceNames ()) { var r = _r; yield return new ManifestResource (r, () => assembly.GetManifestResourceStream (r)); } } /* CECIL version: Mono.Cecil.AssemblyDefinition a = Mono.Cecil.AssemblyDefinition.ReadAssembly (asmInBundle); foreach (Mono.Cecil.ModuleDefinition m in a.Modules) { for (int i = 0; i < m.Resources.Count; i++) { var er = m.Resources[i] as Mono.Cecil.EmbeddedResource; yield return new ManifestResource (er.Name, () => er.GetResourceStream ().ReadToEnd ()); } }*/ }
static string TryInferFramework(string path) { string imageRuntimeVersion = null; try { using (var uni = new IKVM.Reflection.Universe()) { uni.AssemblyResolve += (s, a) => ((IKVM.Reflection.Universe)s).CreateMissingAssembly(a.Name); var asm = uni.LoadFile(path); imageRuntimeVersion = asm.ImageRuntimeVersion; var attr = uni.GetType("System.Attribute, mscorlib"); foreach (var attrib in asm.__GetCustomAttributes(attr, false)) { if (attrib.Constructor.DeclaringType.FullName == "System.Runtime.Versioning.TargetFrameworkAttribute" && attrib.ConstructorArguments.Count == 1) { var parts = ((string)attrib.ConstructorArguments[0].Value).Split(','); string runtime = null, version = null, profile = null; for (int i = 0; i < parts.Length; i++) { int idx = parts[i].IndexOf('='); if (idx < 0) { runtime = parts[i]; } else { switch (parts[i].Substring(0, idx)) { case "Version": version = parts[i].Substring(idx + 1); break; case "Profile": profile = parts[i].Substring(idx + 1); break; } } } if (runtime != null) { var sb = new StringBuilder(runtime); if (version != null) { sb.Append(Path.DirectorySeparatorChar).Append(version); } if (profile != null) { sb.Append(Path.DirectorySeparatorChar).Append("Profile").Append(Path.DirectorySeparatorChar).Append(profile); } string targetFramework = sb.ToString(); return(targetFramework); } } } } } catch (Exception ex) { // not really fussed; we could have multiple inputs to try, and the user // can always use -f:blah to specify it explicitly Debug.WriteLine(ex.Message); } if (!string.IsNullOrEmpty(imageRuntimeVersion)) { string frameworkPath = Path.Combine( Environment.ExpandEnvironmentVariables(@"%windir%\Microsoft.NET\Framework"), imageRuntimeVersion); if (Directory.Exists(frameworkPath)) { return(frameworkPath); } } return(null); }
public static bool ContainsReferenceToSystemRuntime (string fileName) { using (var universe = new IKVM.Reflection.Universe ()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile (fileName); } catch { return false; } foreach (var r in assembly.GetReferencedAssemblies ()) { if (r.FullName.Equals ("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")) return true; } } return false; }
/// <summary> /// Simply get all assembly reference names from an assembly given it's file name. /// </summary> public static IEnumerable<string> GetAssemblyReferences (string fileName) { using (var universe = new IKVM.Reflection.Universe ()) { IKVM.Reflection.Assembly assembly; try { assembly = universe.LoadFile (fileName); } catch { yield break; } foreach (var r in assembly.GetReferencedAssemblies ()) { yield return r.Name; } } /* CECIL version: Mono.Cecil.AssemblyDefinition adef; try { adef = Mono.Cecil.AssemblyDefinition.ReadAssembly (fileName); } catch { yield break; } foreach (Mono.Cecil.AssemblyNameReference aref in adef.MainModule.AssemblyReferences) { yield return aref.Name; }*/ }