アセンブリについては、.NET はそのようなものを使用してアセンブリを開く必要がありFileShare.ReadWrite
ます。それがドメインに読み込まれている場合でも、他のプロセスはファイル全体を書き込んだり、名前を変更したりできます。
私の知る限り、.NETにはFileShare
ファイル共有の名前変更を許可または禁止するための管理された列挙値( のようなものFileShare.Rename
)がありませんが、Win32には必要があるため、アセンブリの読み込みは次のようなマスクでファイルストリームを作成しますFileShare.ReadWrite | FileShare.Rename
(FileShare.Delete
名前の変更だけでなく、全体の削除も含みます)ファイル...)。
これを実証するために、次のコードを試しました。
FileStream a = File.Open(@"C:\blah.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
a.Dispose();
ファイル ストリームが開かれ、破棄されるまで、ファイル全体を削除することはできませんでしたが、名前を変更することはできました。
アセンブリは必要なときに にロードされることに注意してください。つまり、アセンブリがAppDomain
まだロードされていないため、アセンブリを作成、削除、または名前変更できる可能性があります。
に既にロードされているアセンブリを削除しようとしAppDomain
ます: できません (私は今試しましたが、テスト コードはコンソール アプリで実行され、実行中に実行可能ファイルを削除できませんでした)。名前を変更してみてください。動作します。
概要
ファイルがどのように開かれるか、ファイル ストリームが開かれたときにどのファイル マスク構成が使用されたかがすべてです。
次のようにコードを変更すると、ファイル全体の名前を変更できます (ファイルを削除することもできます!)。
FileStream fileStream = File.Open(@"C:\temp\test1.txt", FileMode.Open, FileShare.ReadWrite | FileShare.Delete);
Console.ReadLine();