Пример #1
0
        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 ());
             *      }
             * }*/
        }
Пример #3
0
        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);
        }
Пример #6
0
 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);
 }
Пример #7
0
 /// <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);
         }
     }
 }
Пример #8
0
 /// <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);
        }
Пример #10
0
 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);
     }
 }
Пример #11
0
        /// <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;
		}
Пример #16
0
		/// <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 ());
				}
			}*/
		}
Пример #17
0
        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);
        }
Пример #18
0
		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;
		}
Пример #19
0
		/// <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;
			}*/
		}