//加载所需的所有程序集 private void loadAssemblys() { AssemblyDefinition bundleAssemblyDefinition = AssemblyDefinition.ReadAssembly(bundleAssemblyFileName); AssemblyNameDefinition bundleAssemblyNameDefinition = bundleAssemblyDefinition.Name; //修改名称 bundleAssemblyNameDefinition.Name = getAssemblyNameWithGuid(bundleAssemblyNameDefinition.Name); //去掉强签名 removeAssemblyStrongName(bundleAssemblyNameDefinition); foreach (ModuleDefinition moduleDefinition in bundleAssemblyDefinition.Modules) { foreach (AssemblyNameReference assemblyNameReference in moduleDefinition.AssemblyReferences) { String assemblyName = assemblyNameReference.Name; BundleImpl bundle = getBundleFromRequiredBundles(assemblyName); if (bundle == null) { //没找到此名称的插件,首先,如果此程序集属于FCL if (BundleUtils.IsAssemblyBelongsFCL(assemblyName)) { continue; } //然后尝试从bootdelegation字典中搜索 else if (allBundleRefAssemblyDict.ContainsKey(assemblyName)) { assemblyNameReference.Name = getAssemblyNameWithGuid(assemblyNameReference.Name); addRefAssembly(assemblyNameReference.Name, allBundleRefAssemblyDict[assemblyName]); } else { //然后则尝试从lib目录加载 String newAssemblyName = loadAssemblyFromLibDir(assemblyName); if (newAssemblyName == null) { throw new IOException(String.Format("{0}不能解析依赖的程序集[{1}]", this.ToString(), assemblyName)); } assemblyNameReference.Name = newAssemblyName; } } else { AssemblyName requiredBundleAssemblyName = bundle.bundleAssembly.GetName(); assemblyNameReference.Name = requiredBundleAssemblyName.Name; assemblyNameReference.Version = requiredBundleAssemblyName.Version; } //去掉强签名 removeAssemblyStrongName(assemblyNameReference); } moduleDefinition.Attributes &= ~ModuleAttributes.StrongNameSigned; } MemoryStream ms = new MemoryStream(); bundleAssemblyDefinition.Write(ms); bundleAssembly = Assembly.Load(ms.ToArray()); //加载程序集中所有的类 bundleAssembly.GetTypes(); addRefAssembly(bundleAssemblyNameDefinition.Name, bundleAssembly); }
/// <summary> /// 从LIB目录加载程序集并返回新的程序集名称 /// </summary> /// <param name="assemblyName">程序集名称</param> /// <returns>新的程序集名称</returns> private String loadAssemblyFromLibDir(String assemblyName) { //如果是.NET运行库自带的程序集 if (BundleUtils.IsAssemblyBelongsFCL(assemblyName)) { return(null); } String libsDirPath = getBundleLibsDirectoryName(); String assemblyFileName = Path.Combine(libsDirPath, assemblyName + ".dll"); if (!File.Exists(assemblyFileName)) { return(null); } AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(assemblyFileName); AssemblyNameDefinition assemblyNameDefinition = assemblyDefinition.Name; //修改名称 assemblyNameDefinition.Name = getAssemblyNameWithGuid(assemblyNameDefinition.Name); //去掉强签名 removeAssemblyStrongName(assemblyNameDefinition); foreach (ModuleDefinition moduleDefinition in assemblyDefinition.Modules) { foreach (AssemblyNameReference refAssemblyNameReference in moduleDefinition.AssemblyReferences) { String refAssemblyName = refAssemblyNameReference.Name; String newRefAssemblyName = loadAssemblyFromLibDir(refAssemblyName); if (newRefAssemblyName == null) { continue; } refAssemblyNameReference.Name = newRefAssemblyName; //去掉强签名 removeAssemblyStrongName(refAssemblyNameReference); } moduleDefinition.Attributes &= ~ModuleAttributes.StrongNameSigned; } MemoryStream ms = new MemoryStream(); assemblyDefinition.Write(ms); Assembly assembly = Assembly.Load(ms.ToArray()); addRefAssembly(assemblyNameDefinition.Name, assembly); return(assemblyNameDefinition.Name); }