C# 如何简化判断呼叫 DLL流程

iorice 2011-01-17 02:22:54


假设目前有个情境
我有好几个 dll 檔(ex: lib1 lib2.....lib10), 每个档案都有如下同样名称的 class ( Message_Show)
public class Message_Show
{
public List<string> show()
{
List<string> msg = new List<string>();
....
....
....
return (msg);
}
}


我在主程序将那些 dll 加入参考
using lib1
using lib2
...
...
...
using lib10

之后在程序中使用时 必需依照状况去判断去使用哪个名称空间的 Message_Show
if ( i == 0 )
{
lib0.Message_Show msg = new lib0.Message_Show();
...
...
}
else if ( i == 1)
{
lib1.Message_Show msg = new lib1.Message_Show();
...
...
}
...
...
else if ( i == 10)
{
lib10.Message_Show msg = new lib10.Message_Show();
...
...
}

虽然这样是可以达到目的,
但如果有数十甚至上百个 dll 檔, 每个 dll 档又有好几个 class,
那当我主程序需要呼叫 dll 文件的某个方法时, 都要做一长串的判断,
在设计和维护上并不是个好的撰写方式, 不知在这方面有什么好的方式可以避免这种问题的发生
...全文
115 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iorice 2011-01-19
  • 打赏
  • 举报
回复
最后是使用 Reflection 动态加载的方式来简化,
感谢大家给予的意见

public class Global_Define
{
public static string[] dll_filename = { "lib1",
"lib2",
...
...
"lib10",
};
}



Assembly dllFile = System.Reflection.Assembly.LoadFrom("Global_Define.dll_filename[i] + ".dll");
Type = dllFile.GetType(Global_Define.dll_filename[i] + ".Message_Show");
Object obj = dllFile.CreateInstance(type.FullName, true);
MethodInfo mi = project.dll_method("show");
List<string> msg = (List<string>)mi.Invoke(obj, null);
rabbitlzx 2011-01-17
  • 打赏
  • 举报
回复
参考下这个,通过起别名的方式来缩短名字的长度
http://blog.csdn.net/wonsoft/archive/2010/03/13/5376367.aspx
rabbitlzx 2011-01-17
  • 打赏
  • 举报
回复
不可以给命名空间起别名么?
1. namespace PC
2. {
3. // Define an alias for the nested namespace.
4. using Project = PC.MyCompany.Project;
5. class A
6. {
7. void M()
8. {
9. // Use the alias
10. Project.MyClass mc = new Project.MyClass();
11. }
12. }
13. namespace MyCompany
14. {
15. namespace Project
16. {
17. public class MyClass{}
18. }
19. }
20. }
tlzjff 2011-01-17
  • 打赏
  • 举报
回复
字符串拼接加反射。
RHCL 2011-01-17
  • 打赏
  • 举报
回复
...打错写,“抽角”。。。就是说签名相同的把方法抽象为接口,相关的类实例缓存到字典.或直接反射
RHCL 2011-01-17
  • 打赏
  • 举报
回复
明细的不太了解,若你的dll命名或是说类的命名是有规律的,你可以通过反射去实现简化(也损耗不了多少性能),我看你的类都是这样一个排列:
new lib0(),new lib1()....
不知道你的functionName和className签名是否全部一样的?
若一样你干脆抽角一个接口出来,把所有dll的类初始化到一个字典,相关的key就用i来标记,处理就使用接口传递.
iorice 2011-01-17
  • 打赏
  • 举报
回复
举个实例

lib1.dll lib2.dll lib3.dll…… lib10.dll
public class Message_Show
{
public List<string> show()
{
List<string> msg = new List<string>();
....
return (msg);
}
}

public class Data_show
{
public List<string> show()
{
List<string> msg = new List<string>();
....
return (msg);
}
}


主程序
using lib1
using lib2
using lib3
...
using lib10


public fun1()
{
if ( i == 0 )
{
lib0.Message_Show msg = new lib0.Message_Show();
...
}
if ( i == 1 )
{
lib1.Message_Show msg = new lib1.Message_Show();
...
}
...
...
if ( i == 10 )
{
lib10.Message_Show msg = new lib10.Message_Show();
...
}
}

public fun2()
{
if ( i == 0 )
{
lib0.Data_Show da = new lib0.Data_Show();
...
}
if ( i == 1 )
{
lib1.Data_Show da = new lib1.Data_Show();
...
}
...
...
if ( i == 10 )
{
lib10.Data_Show da = new lib10.Data_Show();
...
}
}

有没有方法可以简化流程的?
bruceyue 2011-01-17
  • 打赏
  • 举报
回复
我也不太懂
iorice 2011-01-17
  • 打赏
  • 举报
回复
大概就是说有好几个dll, 每个dll里的class 及函数名称都相同,
当主程序需要判断调用 function时, 需要写一长串的程序代码去判断function在哪个dll里,
若dll有好几个 class, 那岂不是每个 class 都要写一次表驱动?
有没有办法在一开始就判断, 我要加载哪个 dll 的办法?
wanghui0380 2011-01-17
  • 打赏
  • 举报
回复
不知道具体的东西

我们只能从通常的解决方法入手。如果只单纯重构这部分的话,我想大部分人会选择“表驱动”的方式完成

有关表驱动的简要说明

http://blog.csdn.net/sunyonggao/archive/2007/05/07/1598781.aspx

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧