私は、IMPLICITLYがdll /ファイルのハンドルを開くアプリケーションを持っています。アプリケーションのある時点で、このハンドルを解放したいと思います。どうしたらいいですか?私のアプリケーションはC#です。C#でハンドルを解放する方法は?
答えて
使用のPInvokeあなたが問題のファイルは何
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);
しかし、どのように私は閉じる必要があるハンドルを見つけることができます。私はファイル名だけを知っています。私のプロセスがそのファイルでオープンしたハンドルは不明です。 – Poulo
Processクラスを使用してexeを起動しますか? –
ハンドルを開いたクラスの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
またはファイルを別のプログラムへのアクセスを持つことができたときにあなたのプログラムのISN」走っている。
.NETが再度アクセスしようとすると、プログラムをクラッシュさせる可能性が高いハンドルを実際に処理しようとすると、プロセスごとのハンドルのリストを取得する方法があります。それほど美しいものではありません。その例はC++です: http://www.codeguru.com/forum/showthread.php?t=176997
あなたは正確に何をしようとしていますか?いくつかのことをするためにアセンブリを読み込み、完全にアンロードする場合は、新しいアプリケーションドメインの作成に頼る必要があります。
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
それとも、あなたがファイルロックを維持するだけ 心配しているならば、あなたは シャドウコピーを使用することができため、この記事を見てください。それはディスク上のファイルのコピー を作成し、それを新しい場所 からロードします。元のファイル はそのロードによってロックされません。 にするには、 AppDomainを作成するときにAppDomainSetup.ShadowCopyFilesを "true"に設定するか、 を既に作成した後に に設定してください。
- 1. C#プロセスがファイルのハンドルを解放するまでのブロックコード
- 2. Cでこのポインタのメモリを解放する方法は?
- 3. asprintf():ポインタを解放する方法は?
- 4. webdriverIOで鍵を解放する方法
- 5. httpclient4.5.4でPoolingHttpClientConnectionManagerを解放する方法
- 6. メモリ解放C++
- 7. XMLHttpRequestオブジェクトを解放する方法と、ActiveXObject( "Microsoft.XMLHTTP")オブジェクトを解放する方法はありますか?
- 8. これはCのメモリを解放する正しい方法ですか?
- 9. cでリンクリストを解放する
- 10. Cで単純なリンクリストのメモリを解放する2つの方法は?
- 11. JSONConnectionオブジェクトを解放する方法
- 12. ファイルストリームリソースを解放する方法
- 13. ブラウザセッションを解放する方法
- 14. UINavigationController全体を解放する方法
- 15. MPMoviePlayerControllerプリロードメモリを解放する方法
- 16. Xamarin GPSサービスを解放する方法
- 17. ブロックを解放する方法
- 18. これはメモリを解放する良い方法ですか?
- 19. C#でCOMオブジェクトを解放します
- 20. c#ストリームライター/リーダーを読み込んだ後でファイルを解放する方法
- 21. javascriptでクロージャのメモリを解放する方法は?
- 22. ログアウトアプリケーションでメモリを解放する方法は?
- 23. Xcode 4.2で変数を解放する方法は?
- 24. C#:スレッドを正しく解放する
- 25. プロパティを解放する(Objective-C)
- 26. Cポインタをポインタに解放する
- 27. C++デストラクタがメモリを解放する
- 28. ランタイムコンポーネントで作成されたC++ WinRTクラスのメモリを解放する方法
- 29. C++で未知のウィンドウのハンドルを見つける方法は?
- 30. MediaPlayerを停止または解放する方法は?
を閉じたいハンドラを持っている場合は?それはリソースまたは参照されたアセンブリですか?あなたはなぜそれが開かれているのかを知っているようです。それは、それが何のために使われているのか、いつ閉じられるのかについての最も大きなヒントです。ケアしてみましょうか? –
すべて280Z28は言った...プラス "シャドウコピー"; - –
Ok。私のアプリケーションは、GUIオートメーションツールを使ってインストーラのテストを行っています。インストーラを起動します。(xyx.exe)オートメーションツールで生成されたコードを使用して、インストーラを使用してソフトウェアを更新するGUI操作を実行します。この間、 'xyz.exe'にハンドルが開かれ、閉じられません。 これは閉じたいハンドルです。 生成されたコードにはすべての静的メンバーが含まれているため、DisposeメソッドまたはCloseメソッドを呼び出すことはできません。どちらもアセンブリをロードしないので、別のアプリケーションドメインを作成して使用後にアンロードすることはできません。 – Poulo