// 递归扫描插件基目录下的所有子目录以查找程序集和数据文件 static bool ScanSubdirecotires(ScanFilePack filePack, string subdirectory, AddinFilePack matchingFilePack) { var shouldRescan = false; var files = Directory.GetFiles(subdirectory); foreach (var file in files) { if (IsAssembly(file)) { shouldRescan |= IsScannableAssemblyFile(file, matchingFilePack); filePack.AddAssemblyFile(file); } else { filePack.AddDataFile(file); } } var childDirectories = Directory.GetDirectories(subdirectory); foreach (var childDirectory in childDirectories) { shouldRescan |= ScanSubdirecotires(filePack, childDirectory, matchingFilePack); } return(shouldRescan); }
internal AddinRecord(AddinMetadata metadata) { _addinMetadata = metadata; _addinHeader = new AddinHeaderRecord(); _addinFilePack = new AddinFilePack(); //OperationStatus = AddinOperationStatus.Unaffected; }
static bool IsScannableManifestFile(string file, AddinFilePack matchingFilePack) { var fi = IoHelper.GetFileInfo(file); return(fi.Length != matchingFilePack.ManifestFile.FileLength || fi.LastWriteTime != matchingFilePack.ManifestFile.LastWriteTime || IoHelper.GetFileHash(file) != matchingFilePack.ManifestFile.FileHash); }
internal AddinRecord(AddinHeaderRecord addinHeader, AddinFilePack addinFilePack, AddinActivatorRecord addinActivator) { _addinFilePack = addinFilePack; _addinHeader = addinHeader; _addinActivator = addinActivator; //OperationStatus = AddinOperationStatus.Unaffected; _addinMetadata = new AddinMetadata(); }
internal override ScanFilePack ScanForFilePack(string probingDirectory, string addinDirectory, string manifestFileName, AddinFilePack matchingFilePack) { //var addinDirectoryName = Path.GetFileName(addinDirectory); var filePack = new ScanFilePack { AddinDirectory = addinDirectory, AddinProbingDirectory = probingDirectory }; return(matchingFilePack != null ? DoScanForFilePack(filePack, addinDirectory, manifestFileName, matchingFilePack) : DoScanForFilePack(filePack, addinDirectory, manifestFileName)); }
static bool IsScannableAssemblyFile(string file, AddinFilePack matchingFilePack) { if (matchingFilePack.AssemblyFiles == null) { return(true); } foreach (var assemblyFile in matchingFilePack.AssemblyFiles) { if (!file.EndsWith(assemblyFile.FilePath, StringComparison.InvariantCultureIgnoreCase)) { continue; } if (IoHelper.GetLastWriteTime(file) != assemblyFile.LastWriteTime) { return(true); } } return(false); }
internal static AddinFilePack ToAddinFilePack(AddinResolution adnResolution) { var result = new AddinFilePack { ManifestFile = ToPersistentObject(adnResolution.ManifestFile) }; if (adnResolution.Assemblies != null) { foreach (var asmResolution in adnResolution.Assemblies) { result.AddAssemblyFile(ToPersistentObject(asmResolution.AssemblyFile)); } } if (adnResolution.DataFiles != null) { foreach (var dfResolution in adnResolution.DataFiles) { result.AddDataFile(ToPersistentObject(dfResolution)); } } return(result); }
static ScanFilePack DoScanForFilePack(ScanFilePack filePack, string addinDirectory, string manifestFileName, AddinFilePack matchingFilePack) { //位于插件文件夹下面的文件都被视为潜在包含插件配置的清单文件或程序集文件 //但最终这些文件到底是插件配置文件、程序集文件或数据文件,要根据文件名来决定 var files = Directory.GetFiles(addinDirectory); var shouldRescan = false; foreach (var file in files) { if (IsAssembly(file)) { shouldRescan |= IsScannableAssemblyFile(file, matchingFilePack); filePack.AddAssemblyFile(file); } else if (filePack.ManifestFile == null && file.EndsWith(manifestFileName, StringComparison.InvariantCultureIgnoreCase)) { shouldRescan |= IsScannableManifestFile(file, matchingFilePack); filePack.ManifestFile = file; } else { filePack.AddDataFile(file); } } if (filePack.ManifestFile == null) // 插件清单文件必须位于插件基目录下,如果在插件基目录下未找到清单文件,则认为这不是一个插件 { return(null); } // 递归扫描插件基目录下的所有子目录以查找程序集和数据文件 var subdirectories = Directory.GetDirectories(addinDirectory); foreach (var subdirectory in subdirectories) { shouldRescan |= ScanSubdirecotires(filePack, subdirectory, matchingFilePack); } return(shouldRescan ? filePack : null); }
internal abstract ScanFilePack ScanForFilePack(string probingDirectory, string addinDirectory, string manifestFile, AddinFilePack matchingFilePack);
internal override FilePack GetFilePack(string probeDirectory, string addinDirectory, string manifestFile, AddinFilePack addinFilePack) { var addinDirectoryName = Path.GetFileName(addinDirectory); var filePack = new FilePack { AddinDirectoryName = addinDirectoryName, AddinProbeDirectory = probeDirectory }; //位于插件文件夹下面的文件都被视为潜在包含插件配置的清单文件或程序集文件 //但最终这些文件到底是插件配置文件、程序集文件或数据文件,要看文件内容来决定 var files = Directory.GetFiles(addinDirectory); if (addinFilePack != null) { var shouldRescan = false; foreach (var file in files) { if (IsAssembly(file)) { shouldRescan |= IsScannableAssemblyFile(file, addinFilePack); filePack.AddAssemblyFile(file); } else if (filePack.ManifestFile == null && file.EndsWith(manifestFile, StringComparison.InvariantCultureIgnoreCase)) { shouldRescan |= IsScannableManifestFile(file, addinFilePack); filePack.ManifestFile = file; } else { filePack.AddDataFile(file); } } if (!shouldRescan) { return(null); } } else { foreach (var file in files) { if (IsAssembly(file)) { filePack.AddAssemblyFile(file); } else if (filePack.ManifestFile == null && file.EndsWith(manifestFile, StringComparison.InvariantCultureIgnoreCase)) { filePack.ManifestFile = file; } else { filePack.AddDataFile(file); } } } //位于插件文件夹的子文件夹中的文件都被视为数据文件 var dataDirectories = Directory.GetDirectories(addinDirectory); foreach (var dataDirectory in dataDirectories) { GetAllDataFiles(dataDirectory, filePack); } return(filePack.ManifestFile == null ? null : filePack); }
internal abstract FilePack GetFilePack(string probeDirectory, string addinDirectory, string manifestFile, AddinFilePack addinFilePack);
static bool IsScannableManifestFile(string file, AddinFilePack addinFilePack) { return(IoHelper.GetLastWriteTime(file) != addinFilePack.ManifestFile.LastWriteTime || IoHelper.GetFileHash(file) != addinFilePack.ManifestFile.FileHash); }