原创 使用Assembly来开发c#程序

2009-8-15 21:26 1814 7 7 分类: 软件与OS

什么是Assembly(程序集)?
Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。

Assembly能干什么?
我们可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。

一个简单的演示实例:
1.建立一个Console工程名为:NamespaceRef
2.写入如下代码:


 1None.gifusing System;
 2None.gifusing System.Collections.Generic;
 3None.gifusing System.Text;
 4None.gifusing System.Reflection;
 5None.gif
 6None.gifnamespace NamespaceRef
 7ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 8InBlock.gif    class Program
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
10InBlock.gif        static void Main(string[] args)
11ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
12InBlock.gif            Country cy;
13InBlock.gif            String assemblyName = @"NamespaceRef";
14InBlock.gif            string strongClassName = @"NamespaceRef.China";
15InBlock.gif            // 注意:这里类名必须为强类名
16InBlock.gif            // assemblyName可以通过工程的AssemblyInfo.cs中找到
17InBlock.gif            cy = (Country)Assembly.Load(assemblyName).CreateInstance(strongClassName);
18InBlock.gif            Console.WriteLine(cy.name);
19InBlock.gif            Console.ReadKey();
20ExpandedSubBlockEnd.gif        }

21ExpandedSubBlockEnd.gif    }

22InBlock.gif
23InBlock.gif    class Country
24ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
25InBlock.gif        public string name;
26ExpandedSubBlockEnd.gif    }

27InBlock.gif
28InBlock.gif    class Chinese : Country
29ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
30InBlock.gif        public Chinese()
31ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
32InBlock.gif            name = "你好";
33ExpandedSubBlockEnd.gif        }

34ExpandedSubBlockEnd.gif    }

35InBlock.gif
36InBlock.gif    class America : Country
37ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
38InBlock.gif        public America()
39ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
40InBlock.gif            name = "Hello";
41ExpandedSubBlockEnd.gif        }

42ExpandedSubBlockEnd.gif    }

43ExpandedBlockEnd.gif}

由于Assembly的存在给我们在实现设计模式上有了一个更好的选择。
我们在开发的时候有时候会遇到这样的一个问题,根据对应的名称来创建指定的对象。如:给出chinese就要创建一个chinese对象,以前我们只能这样来写代码:

1None.gifif (strongClassName == "China")
2None.gif    cy = new China();
3None.gifelse if (strongClassName == "America")
4None.gif    cy = new America();
那么如果我们有很长的一系列对象要创建,这样的代码维护起来是很困难的,而且也不容易阅读。现在我们可以通过在外部文件定义类的程序集名称和类的强名称来获得这样一个实例,即易于理解,又增强了扩展性还不用修改代码。
cy = (Country)Assembly.Load(assemblyName).CreateInstance(strongClassName);

结论
Assembly类有很多的方法和属性,它和Type一样有很多功能用于名称与方法和属性之间的转化。深入理解这两个类,你就可以清晰通用语言层是如何工作。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条