题
是否有一种方法可以释放使用后期固定的对象(即由 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();
不隶属于 StackOverflow