如何从c++ dll中删除c# dll

How to delete a C# dll from a C++ dll

本文关键字:dll 删除 c++      更新时间:2023-10-16

我已经创建了一个包含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吗?通过这种方式,您可以更好地控制加载/释放。

你的设计在某些方面是有缺陷的,如果可能的话,我会尽我所能去改变它。我曾见过一些程序(主要是防病毒程序)在用户访问文件后将其打开一段时间。根据加载和释放文件后立即删除文件的能力,听起来不太可靠。