我已经创建了一个包含 RSA 算法的 c# dll,并且在我的 c++ dll 中加载了相同的 dll。当我试图在其使用系统抛出 c# dll 已在使用的异常后删除 c# dll 时,尽管我已经释放了所有接口(interface)指针。 下面是我的代码:
在 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(文件已在使用中)
如何克服这个问题。 如果无法删除,那么解决方法是什么。 请帮帮我。提前致谢。
最佳答案
一些可能的检查/答案:
如果不需要“立即”删除它,您可以使用 MoveFileEx , 在下次重启时删除(如果目标为 NULL,它会删除,而不是移动)。
使用Process Explorer找出哪些句柄仍处于打开状态,并编写代码以显式关闭它们。您还可以使用 Process Explorer 的 UI 关闭句柄,并确认您可以在强制关闭它们后删除 DLL(当然,您的应用程序可能会崩溃)。
尝试 GetModuleHandle("dllname.dll"),查看 DLL 是否仍在您的进程中加载(如果没有返回 NULL),如果仍在加载,则在句柄上尝试 FreeLibrary。
如果 C# 代码是您的,您可以使用 C++/CLI 和普通的“导出函数”来代替 COM 吗?您可以通过这种方式更好地控制加载/释放。
您的设计在某些方面存在缺陷,如果可能,我会尽我所能对其进行更改。我见过一些程序(主要是反病毒程序)会在文件被访问后让文件保持打开状态相当长的一段时间。取决于在加载和释放文件后立即删除文件的能力,这听起来并不可靠。
关于c# - 如何从 C++ dll 中删除 C# dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25450244/