/// <summary> /// 激活引用。 /// </summary> /// <param name="context">扩展装载上下文。</param> /// <param name="referenceEntry">引用条目。</param> public override void ReferenceActivated(ExtensionLoadingContext context, ExtensionReferenceProbeEntry referenceEntry) { if (string.IsNullOrEmpty(referenceEntry.VirtualPath)) { return; } var sourceFileName = _applicationFolder.MapPath(referenceEntry.VirtualPath); //如果程序集文件不存在或者比新的旧则复制新的程序集文件到依赖目录。 var copyAssembly = !_assemblyProbingFolder.AssemblyExists(new AssemblyDescriptor(referenceEntry.Name)) || File.GetLastWriteTimeUtc(sourceFileName) > _assemblyProbingFolder.GetAssemblyDateTimeUtc(new AssemblyDescriptor(referenceEntry.Name)); if (!copyAssembly) { return; } context.CopyActions.Add(() => _assemblyProbingFolder.StoreAssembly(new AssemblyDescriptor(referenceEntry.Name), sourceFileName)); //如果程序集已经被加载,需要重新启动AppDomain if (!_hostEnvironment.IsAssemblyLoaded(referenceEntry.Name)) { return; } Logger.Information("ReferenceActivated: 引用 \"{0}\" 激活新的程序集文件加载,迫使AppDomain重启", referenceEntry.Name); context.RestartAppDomain = true; }
/// <summary> /// 存储程序集。 /// </summary> /// <param name="moduleName">模块名称。</param> public void StoreAssembly(string moduleName) { var descriptor = _extensionManager.GetExtension(moduleName); if (descriptor == null) { return; } /* var paths = GetModuleAssemblyPaths(descriptor); * if (paths == null) * return; * * foreach (var item in paths) * { * var assembly = item.Key; * var fileName = item.Value; * StoreAssembly(assembly, _applicationFolder.MapPath(fileName)); * }*/ var path = GetModuleAssemblyPath(descriptor); Logger.Information("为模块 \"{1}\" 存储程序集文件 \"{0}\"", path, moduleName); var assemblyDescriptor = new AssemblyDescriptor(moduleName); StoreAssembly(assemblyDescriptor, _applicationFolder.MapPath(path)); }