У меня есть общий DLL-файл служебной программы, используемый в моей программе WPF. Первое, что делает моя программа, - проверить обновленный файл dll и скопировать его в исполняемый каталог - все без ссылки на какие-либо методы или свойства из dll.Время загрузки DLL в Visual Studio vs EXE-файл
Когда я компилирую и запускаю программу изнутри Visual Studio (v10), все работает так, как ожидалось. Программа запускается, проверяет файл dll, копирует, если необходимо, а затем переходит к использованию сборки.
Если я запустил скомпилированный файл .exe из Проводника Windows, кажется, первое, что он делает, это загрузить сборку Util.dll. Это заблокирует файл и не позволит мне его обновить.
У кого-нибудь есть представление о том, почему программа будет работать по-разному в Visual Studio по сравнению с .exe-файлом? Любые мысли о отслеживании того, что вызывает сборку при загрузке .exe-файла?
Вот фрагмент кода запуска программы:
void AppLoad(object sender, StartupEventArgs e)
{
//Used to see what assemblies are loaded.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (var item in AppDomain.CurrentDomain.GetAssemblies())
{
sb.AppendLine(item.FullName.ToString());
}
System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "test.txt", sb.ToString());
//Check for the latest Util dll.
if (!UpdateUtil())
{
//Shutdown.
Application.Current.Shutdown();
return;
}
//Start the main window.
MainWindow m = new MainWindow();
m.Show();
}
bool UpdateUtil()
{
//Verify network path.
if (!Directory.Exists(_componentPath))
{
MessageBox.Show("The program encountered an error.\r\rPlease contact your Program Administrator with the following information:\r\r" +
"Program Name - Genesis Admin\r\r" +
"Error Message - Network Component path not found.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return false;
}
//Verify file existance.
string sourceFileName = _componentPath + "Util.dll";
if (!File.Exists(sourceFileName))
{
MessageBox.Show("The program encountered an error.\r\rPlease contact your Program Administrator with the following information:\r\r" +
"Program Name - Genesis Admin\r\r" +
"Error Message - Network Util file not found.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return false;
}
string destFileName = AppDomain.CurrentDomain.BaseDirectory + "Util.dll";
if (!File.Exists(destFileName) || File.GetLastWriteTime(sourceFileName) > File.GetLastWriteTime(destFileName))
File.Copy(sourceFileName, destFileName, true);
return true;
}
FYI это никогда не будет работать в производственной среде, так как большинство ИТ-администраторов могут отказаться от этой практики (очень небезопасно). – tsells