我的 WPF 程序中使用了一个通用实用程序 dll 文件。我的程序做的第一件事是检查更新的 dll 文件并将其复制到执行目录 - 所有这些都没有引用 dll 中的任何方法或属性。
当我从 Visual Studio (v10) 内部编译和运行程序时,一切都按预期工作。程序启动,检查 dll 文件,如果需要进行复制,然后继续使用程序集。
如果我从 Windows 资源管理器运行编译的 .exe 文件,它似乎做的第一件事就是加载 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;
}