Pergunta

Eu tenho um aplicativo que IMPLICITLY abre um identificador em uma dll / arquivo. Em algum ponto no aplicativo, eu quero liberar esse identificador. Como eu posso fazer isso? A minha aplicação é em C #.

Foi útil?

Solução

usar PInvoke se você tem um manipulador que deseja perto

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

Outras dicas

O que exatamente você está tentando fazer? Se você quiser carregar um assembly para fazer alguma coisa com isso, e depois descarregá-lo completamente, você precisa contar com a criação de um novo domínio de aplicativo.

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);
}

Tenha um olhar para este post para mais, http: //blogs.msdn.com/suzcook/archive/2003/07/08/57211.aspx

Ou, se você só está preocupado com mantendo o arquivo bloqueado, você poderia usar sombra copiando. Isso fará com que uma cópia do arquivo no disco e carregá-lo de o novo local. O arquivo original não vai ser bloqueada por aquela carga. Para fazer isso, set AppDomainSetup.ShadowCopyFiles para "True" ao criar o AppDomain ou conjunto AppDomain.ShadowCopyFiles para true depois ele já foi criado.

Basta usar o Descarte ou Fechar método da classe que abriu o punho.

Eu não sei uma maneira fácil. Excesso de bloqueio de arquivos implícita é algo que eu sempre gostei sobre o Windows.

Se você precisar substituir o arquivo, MoveFileEx pode fazê-lo na próxima inicialização. Você poderia usá-lo para renomear ou apagar o original e renomeie outra coisa em seu lugar. http://msdn.microsoft.com/en-us /library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx. html

Se você não quer mexer com a API diretamente há MoveFile na suíte SysInternals que faz a mesma: http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx

Ou você pode ter outro acesso ao programa o arquivo quando o programa não está em execução.

Há maneiras de obter uma lista de alças por processo, se você realmente quiser tentar fechar o identificador, que seria provavelmente apenas travar o seu programa se .NET tenta acessá-lo novamente. Não é bonito, eo exemplo é C ++: http://www.codeguru.com/forum/showthread.php?t= 176997

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top