是否有一种方法可以释放使用后期固定的对象(即由 Activator.CreateInstance() 方法)?

我有一个将文件从一种格式转换为另一种格式的应用程序。执行这些翻译的组件现场直播在我的应用程序目录中的文件夹中。

当应用程序首次启动时,我可以从Translation文件夹中删除这些组件,而无需任何错误。但是,一旦我通过应用程序处理文档(并使用后期绑定绑定到翻译组件之一),我将无法再删除翻译组件。在这一点上,我正在收到一条错误消息,指出文件“在另一个应用程序中使用”。

完成使用后,是否有一种方法可以在我的应用程序中“释放”后期对象?

有帮助吗?

解决方案

将组件加载到应用程序域中后,将保留到应用程序域关闭为止。

为了使整个组件加载到其自己的应用程序域中,例如:

AppDomain app = AppDomain.CreateDomain("PlugInDomain");
ObjectHandle objectHandle = app.CreateInstanceFrom(assemblyPath, 
             "MyNamespace.MyComponent");
MyComponent component = (MyComponent) objectHandle.Unwrap();

// do stuff

// Now kill app domain, assembly can be overwritten after this.
AppDomain.Unload(app);

其他提示

将组件加载到执行AppDomain中后,它就无法卸载(无论它是否是通过用Activator.CreateinStance进行反射创建的)。

这里建议的方法是实现一个辅助AppDomain,其寿命可以在要处置组件时可以卸载。

有很多例子,但这里有一个:http://www.dotnet247.com/247Reference/msgs/28/142174.aspx.

由于管理辅助应用程序的寿命可能会很痛苦,因此作为替代方案,如果您使用的是ASP .NET并希望加载许多动态组件,则可以检查当前的AppDomain何时通过绑定到动态加载的组件饱和。 AppDomain.CurrentDomain.AssemblyLoaded 事件并保持计数,然后请求托管环境在达到关键数字(例如500)时回收当前的AppDomain,例如:

HostingEnvironment.InitiateShutdown();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top