循环引用的解决方法
2010-01-21 15:15
239 查看
循环引用的解决方法
项目架构:
系统中的各功能都是分开在每个dll中实现的,主程序中加载各个菜单对应的dll。对于一些重复性比较高的功能代码,可以写在一个主dll里供其他功能调用,直接引用主dll就可以实现。
Main.exe 主程序。
Core.dll 公共接口和存贮缓存等。
T1.dll 功能1
T2.dll 功能2
现在项目有这样的需求:
要求两个功能之间相互调用,即T1.dll中在T1.MainForm中点击Button1去调用T2.dll中T2.MainForm中的相应功能,反之亦然,T2.MainForm点击Button1调用T1.dll功能。
这时就遇到了问题,直接在工程中引用dll就会出现循环引用。所以得另辟蹊径。
解决方案:
利用反射调用dll,就避免了循环引用。不同功能间的相互通信可通过接口来解决。
具体实现:
Main.exe中用反射加载各个功能菜单,对各个Form进行实例化,缓存起来供其他功能调用。入口和实例均存在Core.MenuFactory.htMenu这个HashTable中。
再构造接口IInteraction
Core.ExecuteCommand.run()
T2.MainForm中接口实现参考T1.MainForm中接口实现。
T1.MainForm.Button1_Click()实现参考T2.MainForm.Button1_Click()。
总结:
通过反射解决循环引用,dll的加载都在主工程中进行,就避免了dll循环引用会导致的文件争用问题,即解决了循环引用。
项目架构:
系统中的各功能都是分开在每个dll中实现的,主程序中加载各个菜单对应的dll。对于一些重复性比较高的功能代码,可以写在一个主dll里供其他功能调用,直接引用主dll就可以实现。
Main.exe 主程序。
Core.dll 公共接口和存贮缓存等。
T1.dll 功能1
T2.dll 功能2
现在项目有这样的需求:
要求两个功能之间相互调用,即T1.dll中在T1.MainForm中点击Button1去调用T2.dll中T2.MainForm中的相应功能,反之亦然,T2.MainForm点击Button1调用T1.dll功能。
这时就遇到了问题,直接在工程中引用dll就会出现循环引用。所以得另辟蹊径。
解决方案:
利用反射调用dll,就避免了循环引用。不同功能间的相互通信可通过接口来解决。
具体实现:
Main.exe中用反射加载各个功能菜单,对各个Form进行实例化,缓存起来供其他功能调用。入口和实例均存在Core.MenuFactory.htMenu这个HashTable中。
再构造接口IInteraction
Core.ExecuteCommand.run()
public static void run(string className, string assambleName) { Assembly assem = null; System.Type type = null; if (assambleName.Length == 0) { throw new Exception("......"); } //读取本地文件 assem = Assembly.LoadFile(Core.Config.ApplicationConfig.getProperty("ApplicationRootPath") + "\\" + assambleName); type = assem.GetType(className); object Obj = System.Activator.CreateInstance(type); Form obj; if (Obj is Form) { obj = (Form)Obj; } else { throw new Exception("......"); } Core.MenuFactory.AddMenu(className, obj); obj.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; if (Core.Config.ApplicationConfig.getProperty("WindowsStyle").CompareTo("WINDOWS") == 0) { if (Core.Config.ApplicationConfig.getProperty("WindowsPopupStyle").CompareTo("NORMAL") == 0) { obj.Show(); } else { obj.ShowDialog(); } } else { obj.Show(Core.Config.ApplicationConfig.getWorkbench().DockPanel); } obj.Focus(); }
T2.MainForm中接口实现参考T1.MainForm中接口实现。
T1.MainForm.Button1_Click()实现参考T2.MainForm.Button1_Click()。
总结:
通过反射解决循环引用,dll的加载都在主工程中进行,就避免了dll循环引用会导致的文件争用问题,即解决了循环引用。
相关文章推荐
- JavaScript中几种常用的解决for循环中引用同一循环变量对象的方法
- JS闭包循环引用导致内存泄漏之解决方法
- iOS 面试题~避免循环引用~解决方法
- 用JAXB转换XML和Java对象时的循环引用问题的解决方法
- **ios 解决Block内用self循环引用的方法**
- EF生成的实体类.序列化循环引用的解决方法
- shared_ptr循环引用的例子及解决方法示例
- Python中循环引用(import)失败的解决方法
- EntityFramework Model有外键时,Json提示循环引用 解决方法
- 有自定义控件的网站项目发布时,“不允许循环文件引用”的错误”的解决方法
- 闭包的循环引用 与 解决(三种方法)
- shared_ptr造成的循环引用&&解决方法和原理(弱引用&&强引用)
- 闭包的循环引用 与 解决(三种方法)
- 解决block循环引用的三种方法
- Swift学习记录 -- 14.闭包的使用和解决循环引用方法
- ARC环境下block循环引用解决方法
- EntityFramework Model有外键时,Json提示循环引用 解决方法
- swift中解决循环引用的方法
- PHP的foreach中使用引用时需要注意的一个问题和解决方法