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

标签 c# c++ .net dll com

我已经创建了一个包含 RSA 算法的 c# dll,并且在我的 c++ dll 中加载了相同的 dll。当我试图在其使用系统抛出 c# dll 已在使用的异常后删除 c# dll 时,尽管我已经释放了所有接口(interface)指针。 下面是我的代码:

在 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,它会删除,而不是移动)。

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

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

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

您的设计在某些方面存在缺陷,如果可能,我会尽我所能对其进行更改。我见过一些程序(主要是反病毒程序)会在文件被访问后让文件保持打开状态相当长的一段时间。取决于在加载和释放文件后立即删除文件的能力,这听起来并不可靠。

关于c# - 如何从 C++ dll 中删除 C# dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25450244/

相关文章:

c# - 插件架构 .net maf 或 mef

java - BouncyCasSTLe 编码差异

C++ 引用参数函数

c++ - 类模板构造函数重载解决歧义

c# - 从 C# 方法,如何调用和运行 DLL,其中 DLL 名称来自 String 变量?

java - Java 和 .NET 的测试和模拟框架

c# - FindGameObjectWithTag(Tag tag) 的性能与在 Unity 中为游戏对象使用公共(public)变量的对比

c# - 如何可靠地确定一个实体是 transient 的?

c++ - 需要改变的东西

C# 为什么其中一些使用委托(delegate)和泛型的方法没有启动?