Komentarz przez ElmoDev001 doprowadził mnie do osiągnięcia pożądanych rezultatów.
Są błędy, ale tutaj jest ogólna idea:
Program.cs (klasa główna)
class Program {
static void Main(string[] args)
{
String Temp = System.IO.Path.GetTempPath();
String tmpDir = Temp + @"tmp\";
String fileName = String.Concat(Process.GetCurrentProcess().ProcessName, ".exe");
String filePath = Path.Combine(Extension.AssemblyDirectory, fileName);
String tempFilePath = Path.Combine(tmpDir, fileName);
if (!Directory.Exists(tmpDir)) { Directory.CreateDirectory(tmpDir); }
if (!(string.Equals(filePath, tempFilePath))) // if the application is not running at temp folder
{
if (!(File.Exists(tempFilePath))) // if the application does not exist at temp folder
{
ext.initFile();
}
else if (File.Exists(tempFilePath)) // if the application already exists at temp folder
{
File.Delete(tempFilePath);
ext.initFile();
}
}
else if (string.Equals(filePath, tempFilePath)) // if the application is running at temp folder
{
//main code
}
}
}
Extension.cs
class Extension
{
String Temp = System.IO.Path.GetTempPath();
String tmpDir = Temp + @"tmp\";
String fileName = String.Concat(Process.GetCurrentProcess().ProcessName, ".exe");
String filePath = Path.Combine(Extension.AssemblyDirectory, fileName);
String tempFilePath = Path.Combine(tmpDir, fileName);
public static string AssemblyDirectory
{
get
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
public static void initFile()
{
File.Copy(filePath, tempFilePath);
Process.Start(tempFilePath);
System.Environment.Exit(0);
}
}
chciałbym zrobić w tym sposób: po uruchomieniu aplikacji kopiuje plik wykonywalny i zależności w folderze tymczasowym, a następnie restartuje aplikację z kopii tymczasowej i zabija pierwszy inst ance. – ElmoDev001
Rozwiązanie z codeproject wydaje się być innym rodzajem aplikacji: uruchamia drugi plik wykonywalny (z urządzenia wymiennego) z podstawowego pliku wykonywalnego, który utrzymuje się na dysku systemowym. – ElmoDev001
Co się stanie teraz, jeśli usuniesz dysk? Moje założenie jest następujące: aby móc uruchomić plik wykonywalny, należy najpierw załadować. Nie wiem, jak dokładnie ładowanie się pojawia (możesz [zbadać] (http://reversingproject.info/wp-content/uploads/2009/05/an_in-depth_look_into_the_win32_portable_executable_file_format_part_2.pdf)), ale spodziewałbym się, że tylko zasoby (gdy są dostępne później) jest problem. Załaduj je wstępnie i użyj wersji buforowanej = nie musisz już mieć dostępu do dysku = nie ma problemu. Popraw mnie, jeśli się mylę (powiedz co się teraz stanie). – Sinatr