同じコードが 32 ビット システムで正常に実行される理由がわかりませんが、64 ビット システムで実行しようとすると、常にエラーが発生します。
別のプロセスによって使用されているファイル
ファイルの変更を監視するためのファイル ウォッチャー イベントを宣言します。
私のコードは以下のようなものです:
static void Main()
{
//init load file
LoadAssembly(dll);
//bind watching event.
FileSystemWatcher watcher = new FileSystemWatcher(rootPath, "*.dll");
watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite;
watcher.Changed += new FileSystemEventHandler(TemplateFile_Changed);
watcher.IncludeSubdirectories = false;
watcher.EnableRaisingEvents = true;
}
private LoadAssembly(assemblyFile)
{
try
{
using (FileStream fs = new FileStream(assemblyFile, FileMode.Open, FileAccess.Read, FileShare.Read))
{
//read a file and write to memorystream.
......
fs.Close();
fs.Dispose();
}
asm = Assembly.Load(ms.ToArray());
}
finally
{
ms.Close();
}
}
private void TemplateFile_Changed(object sender, FileSystemEventArgs e)
{
lock (_sync)
{
LoadAssembly(e.FullPath);
}
}
32 ビット システム (私のコンピューター) で動作するコードをテストします。64 ビット システムにデプロイしたときに、ファイルを変更してアプリケーションにこのファイルを再ロードする必要があることを伝えると、常に
別のプロセスによって使用されているファイル`
で
using (FileStream fs = new FileStream(assemblyFile, FileMode.Open, FileAccess.Read, FileShare.Read))
更新-1
まあ、ありがとう@Hans Passantが答えました。この例外は、変更されたイベントを発生させ、ファイルを開いたままにしているファイルウォッチャーによって引き起こされたようです。TemplateFile_Changed に Thread.Sleep() を追加して、この問題を解決しました。
private void TemplateFile_Changed(object sender, FileSystemEventArgs e)
{
lock (_sync)
{
Thread.Sleep(2000);
LoadAssembly(e.FullPath);
}
}