【发布时间】:2013-03-24 12:47:41
【问题描述】:
如果我使用 C# 来 P/Invoke 某个 DLL,实际的 C++ DLL 会在调用期间运行然后被关闭,从而破坏所有使用的内存吗?还是 .NET 会负责 C++ DLL 在非托管“堆”中使用的内存,并在我每次调用静态函数时将指向这些对象的指针指向 C++ DLL?
当我需要某个 C++ 项目使其内存持久化时,我是否应该创建一个 ActiveX/COM 服务器以使其内存持久化,同时又能够从 C# 调用它?
【问题讨论】:
如果我使用 C# 来 P/Invoke 某个 DLL,实际的 C++ DLL 会在调用期间运行然后被关闭,从而破坏所有使用的内存吗?还是 .NET 会负责 C++ DLL 在非托管“堆”中使用的内存,并在我每次调用静态函数时将指向这些对象的指针指向 C++ DLL?
当我需要某个 C++ 项目使其内存持久化时,我是否应该创建一个 ActiveX/COM 服务器以使其内存持久化,同时又能够从 C# 调用它?
【问题讨论】:
如果我使用 C# 来 P/Invoke 某个 DLL,实际的 C++ DLL 会在调用期间运行然后被关闭,从而破坏所有使用的内存吗?
没有。加载 DLL 后,它将保持加载状态。 DLL 的生命周期不与函数调用绑定。这意味着 DLL 中具有静态存储的变量在初始 p/invoke 调用之后仍然存在。
【讨论】:
LoadLibrary 的调用。就像 .net 运行时本身一样。 .net 不“负责”任何事情。它只是使用标准平台机制来加载 DLL。
如果您从 C++-DLL 创建一个对象,它实际上会一直存在,直到您删除它或更确切地说是释放它。由于您需要手动删除非托管对象,因此它将保留。
【讨论】:
COM,您正在创建非托管组件,然后您可以在托管环境中使用这些组件。所以应该是可能的。