2009-08-04 24 views
1

私は、IMPLICITLYがdll /ファイルのハンドルを開くアプリケーションを持っています。アプリケーションのある時点で、このハンドルを解放したいと思います。どうしたらいいですか?私のアプリケーションはC#です。C#でハンドルを解放する方法は?

+0

を閉じたいハンドラを持っている場合は?それはリソースまたは参照されたアセンブリですか?あなたはなぜそれが開かれているのかを知っているようです。それは、それが何のために使われているのか、いつ閉じられるのかについての最も大きなヒントです。ケアしてみましょうか? –

+0

すべて280Z28は言った...プラス "シャドウコピー"; - –

+0

Ok。私のアプリケーションは、GUIオートメーションツールを使ってインストーラのテストを行っています。インストーラを起動します。(xyx.exe)オートメーションツールで生成されたコードを使用して、インストーラを使用してソフトウェアを更新するGUI操作を実行します。この間、 'xyz.exe'にハンドルが開かれ、閉じられません。 これは閉じたいハンドルです。 生成されたコードにはすべての静的メンバーが含まれているため、DisposeメソッドまたはCloseメソッドを呼び出すことはできません。どちらもアセンブリをロードしないので、別のアプリケーションドメインを作成して使用後にアンロードすることはできません。 – Poulo

答えて

4

使用のPInvokeあなたが問題のファイルは何

[System.Runtime.InteropServices.DllImport("Kernel32")] 
private extern static Boolean CloseHandle(IntPtr handle); 
+2

しかし、どのように私は閉じる必要があるハンドルを見つけることができます。私はファイル名だけを知っています。私のプロセスがそのファイルでオープンしたハンドルは不明です。 – Poulo

+0

Processクラスを使用してexeを起動しますか? –

0

ハンドルを開いたクラスのDisposeメソッドまたはCloseメソッドを使用してください。

0

私は簡単な方法を知らない。過度の暗黙的なファイルロックは、私が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

4

あなたは正確に何をしようとしていますか?いくつかのことをするためにアセンブリを読み込み、完全にアンロードする場合は、新しいアプリケーションドメインの作成に頼る必要があります。

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"に設定するか、 を既に作成した後に に設定してください。

関連する問題