【问题标题】:How to delete a C# dll from a C++ dll如何从 C++ dll 中删除 C# dll
【发布时间】:2014-10-16 11:57:32
【问题描述】:

我创建了一个包含 RSA 算法的 c# dll,并且我的 c++ dll 中正在加载相同的 dll。当我试图删除 c# dll 后,它的使用系统抛出异常 c# dll 已经在使用中,尽管我已经释放了所有接口指针。 以下是我的代码:

在 C++ 中

ICryptInterfaceRSA *crpt = null;
coinitialize(null);
hresult hr = ::cocreateinstance(guid1,guid2,<reinterpret cast>(void**)&crypt);
//doing my encryption and decryption
crpt->Release();
coUninitialize();

//Problem occurs at below mentioned code 
BOOL b = DeleteFile("C# dll file path");
DWORD dw = GetLasterror();

dw 为 5(文件已在使用中)

如何克服这个问题。 如果无法删除,那么解决方法是什么。 请帮帮我。提前致谢。

【问题讨论】:

  • 1) 您是否还有参考资料? 2) CoUninitialize 仅适用于当前线程 - 您是否使用更多线程? 3) 这似乎是 STA 使用,所以 CoUninitialize 应该 立即释放。 MTA 线程有(10 分钟?)延迟。
  • 这里没有使用其他线程,只有主线程处于活动状态。
  • 在删除 dll 之前,您是否致电 FreeLibrary
  • 操作系统会定期尝试释放 DLL,它会调用 COM 服务器的 DllCanUnloadNow() 入口点。您可以通过调用 CoFreeUnusedLibraries() 来加快速度。并不是说这会起作用,当被问到时,CLR 会说“不”。如果您需要这种控制,那么您需要自己托管 CLR,以便您可以销毁 AppDomain。
  • 我使用了 DllCanUnloadNow() 和 CoFreeUnusedLibraries() 仍然存在同样的错误。

标签: c# c++ .net dll com


【解决方案1】:

一些可能的检查/答案:

如果不需要“现在”删除它,您可以使用MoveFileEx,在下次重新启动时删除(如果目标为 NULL,它会删除,而不是移动)。

使用Process Explorer 找出哪些句柄仍处于打开状态,并编写代码显式关闭它们。您还可以使用 Process Explorer 的 UI 关闭句柄,并确认您可以在强制关闭它们后删除 DLL(您的应用当然可能会崩溃)。

尝试 GetModuleHandle("dllname.dll"),查看 DLL 是否仍在您的进程中加载​​(如果没有则返回 NULL),如果仍然加载,请尝试使用句柄上的 FreeLibrary。

如果 C# 代码是你的,你能用 C++/CLI 和普通的“导出函数”代替 COM 吗?通过这种方式,您可以更好地控制加载/释放。

您的设计在某些方面存在缺陷,如果可能,我会尽我所能进行更改。我见过一些程序(主要是防病毒程序)在文件被访问后会在相当长的时间内保持打开状态。取决于在加载和释放文件后立即删除文件的能力,这听起来并不可靠。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2015-02-22
    • 2011-09-28
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2021-03-22
    相关资源
    最近更新 更多