質問
dll / fileのハンドルを暗黙的に開くアプリケーションがあります。アプリケーションのある時点で、このハンドルを解放します。どうすればいいですか?私のアプリケーションはC#です。
解決
閉じるハンドラーがある場合は、PInvokeを使用します
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);
他のヒント
まさにあなたがやろうとしていることは何ですか?アセンブリを読み込んで処理を行い、それを完全にアンロードする場合は、新しいアプリドメインの作成に依存する必要があります。
public static void Main(string[] args)
{
AppDomain appDomain = AppDomain.CreateDomain("NewAppDomain");
appDomain.DoCallBack(new CrossAppDomainDelegate(AsmLoad));
// At this point, your assembly is locked, you can't delete
AppDomain.Unload(appDomain);
Console.WriteLine("AppDomain unloaded");
//You've completely unloaded your assembly. Now if you want, you can delete the same
}
public static void AsmLoad()
{
Assembly assembly = Assembly.LoadFrom(@"c:\Yourassembly.dll");
//Loaded to the new app domain. You can do some stuff here
Console.WriteLine("Assembly loaded in {0}",AppDomain.CurrentDomain.FriendlyName);
}
詳細については、この投稿をご覧ください http: //blogs.msdn.com/suzcook/archive/2003/07/08/57211.aspx
または、心配しているだけの場合 ファイルをロックしたまま、使用できます シャドウコピー。それはコピーを作成します ディスク上のファイルの 新しい場所。元のファイル その負荷によってロックされません。に それを行う、設定 AppDomainSetup.ShadowCopyFiles to " true" AppDomainを作成するとき、または AppDomain.ShadowCopyFilesをtrueに設定します 既に作成された後。
ハンドルを開いたクラスのDisposeまたはCloseメソッドを使用するだけです。
簡単な方法がわかりません。過度の暗黙的なファイルロックは、私がWindowsについて常に嫌っていたものです。
ファイルを置き換える必要がある場合、MoveFileExは次回の起動時にそれを行うことができます。それを使用して元の名前を変更または削除してから、別の名前をその場所に変更します。 http://msdn.microsoft.com/en-us /library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx。 html
APIを直接使いたくない場合は、SysInternalsスイートに同じことを行うMoveFileがあります。 http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx
または、プログラムが実行されていないときに別のプログラムにファイルにアクセスさせることができます。
プロセスごとにハンドルのリストを取得する方法があります。本当にハンドルを閉じたい場合は、.NETが再度アクセスしようとするとプログラムがクラッシュする可能性があります。きれいではありません。例はC ++です。 http://www.codeguru.com/forum/showthread.php?t= 176997