如何从C ++ DLL中删除C#dll

时间:2014-08-22 15:09:30

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

我创建了一个包含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 个答案:

答案 0 :(得分:0)

一些可能的检查/答案:

如果不需要“立即删除”,可以使用MoveFileEx,在下次重启时删除(如果目的地为NULL,则删除,而不是移动)。

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

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

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

您的设计在某些方面存在缺陷,如果可能,我会尽我所能改变它。我见过程序(主要是反病毒程序),它们会在访问后保持文件打开相当长的时间。根据在加载文件并释放文件后立即删除文件的能力,听起来不健全。