卸载 appdomain 不会清除 C++ COM 对象静态成员
Posted
技术标签:
【中文标题】卸载 appdomain 不会清除 C++ COM 对象静态成员【英文标题】:Unloading appdomain don't clear C++ COM object static members 【发布时间】:2016-01-23 19:03:20 【问题描述】:我正在使用第 3 方 C++ COM 对象,它似乎包含一些静态成员。问题是我每次开始新的运行时都必须重置静态成员。因此,我目前需要关闭并打开我的应用程序。我尝试使用 AppDomain 卸载这些静态成员的整个内存,但我不知道为什么它不起作用。我正在使用Activator.CreateInstance(Type.GetTypeByCLSID)
提升 COM 对象,我需要手动做些什么来处理这些实例吗?请注意,我检查过并且任何静态 C# 对象都以这种方式处理。
【问题讨论】:
【参考方案1】:非托管资源被称为非托管,因为它们的内存不由托管垃圾收集器处理。
必须手动处置任何非托管资源。这是IDisposable
的目标之一(如果不是最重要的):它的实现有一些相关的非托管资源。例如,FileStream
需要手动处理,因为它是 Win32 API 调用的包装器。
总之,卸载AppDomain
或任何其他方法在这里都无济于事。当您不再需要这些 COM 静态资源时(即关闭应用程序),您需要编写代码来处理它们。
【讨论】:
如何关闭 COM 对象静态资源而不杀死我的应用程序?Marshal.ReleaseComObject
会做这项工作吗?
@maordavid 实际上我不是互操作专家,所以我对其他问题没有明确的答案。顺便说一句,您可以确定任何非托管资源都应由您在应用代码中手动处置...
@maordavid 这些第 3 方 COM 组件也很可能被错误地实现了......他们应该提供一些方法来重新初始化他们未管理的资源或者谁知道......
感谢您的帮助,当我说第 3 方实际上是其他 COM 对象时,我可以要求他添加初始化方法。
@maordavid 好吧,那么这就是要走的路,不是吗?以上是关于卸载 appdomain 不会清除 C++ COM 对象静态成员的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Web 应用程序在部署后不卸载 AppDomains
vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?