如何从c++ dll中删除c# dll
本文关键字:dll 删除 c++ | 更新日期: 2023-09-27 18:19:11
我已经创建了一个包含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(文件已在使用中)
如何克服这个问题。如果它不能被删除,那么变通的办法是什么?请帮帮我。
几个可能的检查/答案:
如果它不需要被删除"现在",你可以使用MoveFileEx,删除在下次重启(如果目的地是NULL,它删除,而不是移动)。
使用进程资源管理器找出仍然打开的句柄,并编写代码显式地关闭它们。你也可以使用进程资源管理器的UI关闭句柄,并确认你可以在强制关闭它们后删除DLL(当然你的应用程序可能会崩溃)。
尝试GetModuleHandle("dllname.dll"),看看DLL是否仍然在你的进程中加载(如果不是返回NULL),并尝试FreeLibrary句柄如果仍然加载
如果c#代码是你的,你可以使用c++/CLI和正常的"导出函数"代替COM吗?通过这种方式,您可以更好地控制加载/释放。
你的设计在某些方面是有缺陷的,如果可能的话,我会尽我所能去改变它。我曾见过一些程序(主要是防病毒程序)在用户访问文件后将其打开一段时间。根据加载和释放文件后立即删除文件的能力,听起来不太可靠。