分类: C#/.net
2014-07-01 22:53:18
sn -k 密钥对文件
sn -p 生成公钥文件
sn -tp 查看公钥
6.资源本地化
1)设定Form的localizable属性为true,通过设定其language属性来自动建立其资源文件,在切换语言的时候,设置Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en");同时使用System.ComponentModel.ComponentResourceManager.ApplyResource方法来更新控件的属性;对话框也采用form形式定制;
2)直接设置资源文件,通过System.Globalization.CultureInfo.CurrentUICulture.Name来决定使用哪一种资源文件,同时使用System.Resources.ResourceManager类来对控件属性进行赋值;
7.多线程同步使用AutoResetEvent或者MannualResetEvent两个类
.Set方法:等同于参数为true的构造函数,使得ResetEvent类的资源可用,使用WaitOne()方法等待的线程不阻塞;
.reset方法:等同于参数为false的构造函数,使得WaitOne方法等待的线程阻塞;
.两者的区别在于AutoResetEvent类在set之后随机被等待(waitone)的任一线程捕获,之后自动设置该类资源不可用,相当于显式调用(Reset);
MannualResetEvent则在set之后所有等待线程都都被唤醒,脱离阻塞状态;
8.关于反射
AppDomain:应用程序域;一组程序集的逻辑容器;
Assembly:程序集类;
Module:模块类;
Type:
以上都具有从属关系;
1)首先需要引用该程序集
Assembly asm=Assembly.load(程序集);
2)asm.createInstance("命名空间.类名").GetType().InvokeMember(函数名,,,,,);
Load在加载弱命名程序集(如上)的时候需要引用程序集,在加载强命名程序集的时候则不需要引用,强命名包括:程序集名,版本信息,语言文化,公钥标记
,并且会加载程序集中引用的其他的程序集;能在程序集上应用安全和部署策略;
2)
Assembly assembly = Assembly.LoadFrom(@”D:/Test/MyAssembly.dll”);
这个方法从指定的路径来加载程序集,实际上这个方法被调用的时候,CLR会打开这个文件,获取其中的程序集版本,语言文化,公钥标记等信息,把他们传递给 Load方法,接着,Load方法采用上面的策略来查找程序集。如果找到了程序集,会和LoadFrom方法中指定的路径做比较,如果路径相同,该程序集 会被认为是应用程序的一部分,如果路径不同或Load方法没有找到程序集,那该程序集只是被作为一个“数据文件”来加载,不会被认为是应用程序的一部分。 这就是在第1点中提到的Load方法比LoadFrom方法的执行效率高的原因。另外,由于可能把程序集作为“数据文件”来加载,所以使用 LoadFrom从不同路径加载相同程序集的时候会导致重复加载。当然这个方法会加载此程序集引用的其他程序集
3)Assembly.LoadFile()
这个方法是从指定的文件来加载程序集,和上面方法的不同之处是这个方法不会加载此程序集引用的其他程序集!
结论:一般大家应该优先选择Load方法来加载程序集,如果遇到需要使用LoadFrom方法的时候,最好改变设计而用Load方法来代替!
Load和LoadFrom加载的程序集在不同的上下文中。
最好不要使用除Load以外的其他其他的Loadxx方法。
从指定路径加载程序集用下面这个:
Assembly.Load(AssemblyName.GetAssemblyName(Path))
9.dynamic表示操作将在运行时解析的对象
Assembly asm = Assembly.Load("ClassLibrary1");
((dynamic)asm.CreateInstance("JayTest.Class1")).SayHell0();
//对比下面的语句,简洁得多
//asm.CreateInstance("JayTest.Class1").GetType().InvokeMember("SayHell0", BindingFlags.InvokeMethod, null, asm.CreateInstance("JayTest.Class1"), null);
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
d.Name = "ServiceBoy";
d.Action = Func
Console.WriteLine(d.Action());
}
一般地,任何一个类——如果需要动态为自身添加属性、方法等的,就必须实现IDynamicObjectProvidor接口或者是DynamicObject虚类(之所以用虚类的原因是“各取所需”的缘故,DynamicObject类都通过虚方法virtual去“实现”了接口中所有的方法,只要继承了这个类,读者可以根据需要“任意”动态覆盖你要的方法)。这里介绍三个最常见的方法
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
public override bool TryGetMember(GetMemberBinder binder, out object result)
public override bool TrySetMember(SetMemberBinder binder, object value)
10. Net的4个版本特性
1.0------委托,其中定义两个常用的Func和Action
2.0------泛型
3.0-----Linq
比如查询某个目录下文件
System.IO.DirectoryInfo dInfo = new System.IO.DirectoryInfo(filePath + "");
string[] strStyle={".AVI",".MP3",".WAV",".RMVB",".RM",".WMV"};
var films= from f in dInfo.GetFiles()
let post=f.Name.Substring(f.Name.LastIndexOf(".")).ToUpper()
orderby f.Name ascending
where strStyle.Contains(post)
select f;
Count = films.Count();
4.0-----Dynamic动态编程