Чтобы избавить кого-то от необходимости делать то, что я только что сделал, и сделать это - это только копирует файлы с другим временем изменения даты. Я проверил, и перестройка вашего приложения меняет это только в нескольких файлах. Это обеспечивает очень быстрый самозагрузчик, который затем запускает исполняемый файл в новом месте и завершает выполнение исполняемого файла, выполняя загрузку, которая выполнялась из старого места. Это может зависеть от нескольких вещей, например, ваша DLL, выполняющая код, должна называться так же, как EXE, который ее запускает.
Работает в .Net 5:
using System;
using System.Diagnostics;
using System.IO;
namespace NetworkHelper
{
public static class LocalCopier
{
public static void EnsureRunningLocally(string callingAssemblyDotLocation)
{
var assemblyFileFriendlyName = Path.GetFileName(callingAssemblyDotLocation.Replace(".", "-"));
var assemblyDirToCheck = Path.GetDirectoryName(callingAssemblyDotLocation);
var localLocation = Configuration.Tools.AppsLocation + assemblyFileFriendlyName + "\\";
var assemblyFinalExePath = localLocation + assemblyFileFriendlyName.Replace("-dll", ".exe");
// Check what assembly passed in path starts with
var runningFromNetwork = callingAssemblyDotLocation.ToLower().StartsWith(@"\\w2k3nas1\");
if (callingAssemblyDotLocation.ToLower().StartsWith(@"i:\")) runningFromNetwork = true;
if (!runningFromNetwork) return;
// Check if copied to local already
Directory.CreateDirectory(localLocation);
// Foreach file in source dir, recursively
CopyOnlyDifferentFiles(assemblyDirToCheck, localLocation);
Process.Start(assemblyFinalExePath);
Environment.Exit(0);
}
private static void CopyOnlyDifferentFiles(string sourceFolderPath, string destinationFolderPath)
{
string[] originalFiles = Directory.GetFiles(sourceFolderPath, "*", SearchOption.AllDirectories);
Array.ForEach(originalFiles, (originalFileLocation) =>
{
FileInfo originalFile = new FileInfo(originalFileLocation);
FileInfo destFile = new FileInfo(originalFileLocation.Replace(sourceFolderPath, destinationFolderPath));
if (destFile.Exists)
{
if (originalFile.LastWriteTime != destFile.LastWriteTime)
{
originalFile.CopyTo(destFile.FullName, true);
}
}
else
{
Directory.CreateDirectory(destFile.DirectoryName);
originalFile.CopyTo(destFile.FullName, false);
}
});
}
}
}
Обратите внимание, что \w2k3nas1 и i: являются примерами сетевых расположений, где, если он запускается из них, он должен копировать себя в локальный каталог, я использую данные приложения/роуминг/localApps, а затем перезапускаю себя из нового каталога.
Все это можно поместить в справочную библиотеку и вызывать из любых клиентских приложений с помощью: NetworkHelpers.LocalCopier.EnsureRunningLocally(Assembly.GetExecutingAssembly().Location);
(Здесь Assembly.GetExecutingAssembly(). Location передается из вызывающего приложения, потому что, если бы вы запускали его из эталонного проекта, вы бы вместо этого получили dll этой библиотеки.)
person
John Sikes
schedule
31.03.2021