我创建了一个包含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(文件已在使用中)
如何克服这个问题。 如果无法删除那么解决方法是什么。 请帮帮我。提前谢谢。
答案 0 :(得分:0)
一些可能的检查/答案:
如果不需要“立即删除”,可以使用MoveFileEx,在下次重启时删除(如果目的地为NULL,则删除,而不是移动)。
使用Process Explorer找出仍处于打开状态的句柄,并编写代码以明确关闭它们。您还可以使用Process Explorer的UI关闭句柄,并确认在强制关闭DLL后可以删除DLL(当然,您的应用可能会崩溃)。
尝试使用GetModuleHandle(“dllname.dll”),查看DLL是否仍在您的进程中加载(如果没有,则返回NULL),如果仍然加载,则尝试使用句柄上的FreeLibrary。
如果C#代码是您的,您可以使用C ++ / CLI和普通的“导出功能”代替COM吗?您可以通过这种方式更好地控制加载/释放。
您的设计在某些方面存在缺陷,如果可能,我会尽我所能改变它。我见过程序(主要是反病毒程序),它们会在访问后保持文件打开相当长的时间。根据在加载文件并释放文件后立即删除文件的能力,听起来不健全。