【发布时间】:2014-10-16 11:57:32
【问题描述】:
我创建了一个包含 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) 您是否还有参考资料? 2) CoUninitialize 仅适用于当前线程 - 您是否使用更多线程? 3) 这似乎是 STA 使用,所以 CoUninitialize 应该 立即释放。 MTA 线程有(10 分钟?)延迟。
-
这里没有使用其他线程,只有主线程处于活动状态。
-
在删除 dll 之前,您是否致电 FreeLibrary?
-
操作系统会定期尝试释放 DLL,它会调用 COM 服务器的 DllCanUnloadNow() 入口点。您可以通过调用 CoFreeUnusedLibraries() 来加快速度。并不是说这会起作用,当被问到时,CLR 会说“不”。如果您需要这种控制,那么您需要自己托管 CLR,以便您可以销毁 AppDomain。
-
我使用了 DllCanUnloadNow() 和 CoFreeUnusedLibraries() 仍然存在同样的错误。