예제 #1
0
		protected void RegisterAssembly (AssemblyDefinition assembly)
		{
			if (assembly == null)
				throw new ArgumentNullException ("assembly");

			var name = assembly.Name.FullName;
			if (cache.ContainsKey (name))
				return;

			cache [name] = assembly;
		}
예제 #2
0
        public bool LoadReferences(ICollection<string> references, IErrorHandler errorHandler)
        {
            bool hasLoadErrors = false;

            AssemblySet assemblySet = new AssemblySet();

            foreach (string referencePath in references) {
                string assemblyFilePath = Path.GetFullPath(referencePath);
                if (File.Exists(assemblyFilePath) == false) {
                    errorHandler.ReportError("The referenced assembly '" + referencePath + "' could not be located.", String.Empty);
                    hasLoadErrors = true;
                    continue;
                }

                string referenceName = Path.GetFileNameWithoutExtension(assemblyFilePath);
                if (assemblySet.IsReferenced(referenceName)) {
                    errorHandler.ReportError("The referenced assembly '" + referencePath + "' is a duplicate reference.", String.Empty);
                    hasLoadErrors = true;

                    continue;
                }

                try {
                    AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath);
                    if (assembly == null) {
                        errorHandler.ReportError("The referenced assembly '" + referencePath + "' could not be loaded as an assembly.", String.Empty);
                        hasLoadErrors = true;
                        continue;
                    }

                    if (referenceName.Equals(CoreAssemblyName, StringComparison.OrdinalIgnoreCase)) {
                        if (_coreAssemblyPath != null) {
                            errorHandler.ReportError("The core runtime assembly, mscorlib.dll must be referenced only once.", String.Empty);
                            hasLoadErrors = true;

                            continue;
                        }
                        else {
                            _coreAssemblyPath = assemblyFilePath;
                            _coreAssembly = assembly;
                        }
                    }
                    else {
                        assemblySet.AddAssembly(assemblyFilePath, referenceName, assembly);
                    }
                }
                catch (Exception e) {
                    Debug.Fail(e.ToString());

                    errorHandler.ReportError("The referenced assembly '" + referencePath + "' could not be loaded as an assembly.", String.Empty);
                    hasLoadErrors = true;
                }
            }

            if (_coreAssembly == null) {
                errorHandler.ReportError("The 'mscorlib' assembly must be referenced.", String.Empty);
                hasLoadErrors = true;
            }
            else {
                if (VerifyScriptAssembly(_coreAssembly) == false) {
                    errorHandler.ReportError("The assembly '" + _coreAssemblyPath + "' is not a valid script assembly.", String.Empty);
                    hasLoadErrors = true;
                }
            }

            foreach (KeyValuePair<string, AssemblyDefinition> assemblyReference in assemblySet.Assemblies) {
                if (VerifyScriptAssembly(assemblyReference.Value) == false) {
                    errorHandler.ReportError("The assembly '" + assemblyReference.Key + "' is not a valid script assembly.", String.Empty);
                    hasLoadErrors = true;
                }
            }

            _assemblyMap = assemblySet.Assemblies;
            _assemblyPaths = assemblySet.GetAssemblyPaths();

            return hasLoadErrors;
        }
예제 #3
0
 public void AddAssembly(string path, string referenceName, AssemblyDefinition assembly)
 {
     _assemblies[path] = assembly;
     _assemblyNames.Add(referenceName);
 }
예제 #4
0
            public AssemblyReference(string path, AssemblyDefinition assembly)
            {
                _path = path;
                _assembly = assembly;

                _dependencies = assembly.MainModule.AssemblyReferences.Select(a => a.FullName).ToList();
            }
예제 #5
0
        private bool VerifyScriptAssembly(AssemblyDefinition assembly)
        {
            foreach (CustomAttribute attribute in assembly.CustomAttributes) {
                if (String.CompareOrdinal(attribute.Constructor.DeclaringType.FullName, "System.Runtime.CompilerServices.ScriptAssemblyAttribute") == 0) {
                    return true;
                }
            }

            return false;
        }