WPFプログラムで使用する汎用ユーティリティdllファイルがあります。私のプログラムが最初に行うことは、更新されたdllファイルをチェックし、それを実行ディレクトリにコピーすることです。これらはすべて、dllからメソッドやプロパティを参照することなく行われます。
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;
}