您的位置:首页 > 其它

循环引用的解决方法

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()

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循环引用会导致的文件争用问题,即解决了循环引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: