Exemplo n.º 1
0
        //加载所需的所有程序集
        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);
        }
Exemplo n.º 2
0
        /// <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);
        }