什么叫强命名程序集?
我们知道,以前在Windows下开发程序时常会遭遇著名的“DLL Hell”问题,即动态链接库的向后兼容问题。微软在.Net产生前曾尝试使用COM组件的方式来解决DLL Hell问题,即使用Guid来唯一的标识每一个COM组件。但是,实际上使用COM组件(包括版本升级)也是一件颇为麻烦的事:为了运行COM组件就必 须在组册表中对其进行注册,重新编译有可能破坏Guid从而导致原来引用此COM组件的程序不能正确运行,等等。
在.Net中,微软引入了一种新的解决方案:强命名程序集(Strong Name),以及与之配套的全局程序集缓存(GAC)来解决这个问题。
我们知道,.Net使用Name、Version、Culture、PublicToken四个属性来唯一标识一个程序集,而不同产品前三个属性 (Name、Version和Culture)完全相同的情况是有可能发生的,如此一来,这唯一标识程序集可重任就落到PublicToken的头上了。 强命名的程序集正是使用RSA来保证PublicToken的唯一性,因为在理论上,非对称算法RSA生成的公钥/私钥对不会重复。.Net正是通过在编 译项目时将指定的公钥/私钥对写入程序集来保证其唯一性。
[更多...]
错误内容:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记
引起原因:多线程异步调用或者创建新窗体时,出现该错误
解决方法:
1、修改main函数 ,前面添加[STAThread]标示(貌似IDE默认)
[STAThread]
static void Main()
[更多...]
virtual 用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
例如,此方法可被任何继承它的类重写。虚拟成员的实现可由派生类中的 重写成员更改。
有关使用 virtual 的更多信息,参考微软 使用 Override 和 New 关键字进行版本控制
用关键字 virtual 修饰的方法,叫虚方法。在子类中用override 声明同名的方法,这叫“重写”。相应的没有用virtual修饰的方法,可以叫实方法
默认情况下,C# 方法为非虚方法。 如果某个方法被声明为虚方法,则继承该方法的任何类都可以实现它自己的版本。 若要使方法成为虚方法,必须在基类的方法声明中使用 virtual 修饰符。 然后,派生类可以使用 override 关键字重写基虚方法,或使用 new 关键字隐藏基类中的虚方法。 如果 override 关键字和 new 关键字均未指定,编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。
[更多...]
1. List<string> strL = new List<string>();
var tt = strL.Where(x => x == "OK").ToList().Count; //List中包含“OK”的总数.
2. List<User> UsersList = new List<User>();
UsersList.Add(new User() { Name = "zzy", ID = 10101 });
UsersList.Add(new User() { Name = "carl", ID = 10102 });
UsersList.Add(new User() { Name = "Tim", ID = 10103 });
List<string> nameList = (from user in UsersList
where user.Name == "zzy" && user.ID == 10101
[更多...]
转自 http://hi.baidu.com/motiansen/blog/item/ca2f0ddd4b746ddf8c10295b.html
众所周知微软的操作系统自带的拷贝是很“弱智”的,速度不高,无断点续传,而且拷贝会拖累其他的应用程序,占用大量的文件缓存。所以很多高级的拷贝工具孕育而生,用过最好的是FastCopy。FastCopy的拷贝速度基本上可以达到磁盘的极限,还因为他开源,所以可以看到其实现。但是很可惜他的工程是VC6的,而且源代码注释都是日文的,不仅如此,其源代码风格很让人迷惑。证实了我的那句话:开源软件的最高境界就是,我开源了,你看不懂;等你看懂了,已经过时了。
要达到最快的拷贝速度和减少对内存的占用,需要对拷贝的过程有一个了解。拷贝无非就是将文件的数据读出来,然后再写进去的一个过程。XP操作系统自带的拷贝工具会首先打开文件句柄,然后将一块数据读取到缓存中,然后再写入到磁盘中。打开“Windows任务管理器”,进程,查看,选择列,打开I/O读取字节,I/O写入字节。拷贝一个文件,注意explorer.exe进程即可看到整个读写过程。基本上可以看到XP对于文件拷贝几乎是属于同时进行的,换句话说其开的缓存比较小,但其效率可能并不见得很高。在我的200G Seagate 7200.8硬盘上,复制速度在15M/s左右。而这个硬盘的平均读取速度在40M/s,平均写入速度也在35M/s以上。
[更多...]
MSDN
释放 WMPLib 的资源
//定义
WindowsMediaPlayerClass wmp = new WindowsMediaPlayerClass();
//释放
public void DisposeWMPLib()
{
if (wmp != null)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wmp);
wmp = null;
System.GC.Collect();
}
}
[更多...]
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void btnUpload_Click( object sender, EventArgs e )
{
if (FileUpload1.PostedFile.InputStream.Length < 1)
{
Msg.Text = "请选择文件。";
return;
}
string FileName = FileUpload1.FileName;
if (FileName.ToLower().IndexOf(".txt") == -1)
{
Msg.Text = "请选择文本文件。";
return;
}
[更多...]
1、建一个结构雇员的结构
private struct Eployee{
public string name;
public int age;
public string sex;
}
2、新建3个"雇员"
Eployee ep1=new Eployee();
ep1.name="小张";
ep1.age=21;
ep1.sex="男";
Eployee ep2=new Eployee();
ep2.name="老李";
ep2.age=43;
ep2.sex="男";
Eployee ep3=new Eployee();
ep3.name="施施";
ep3.age=18;
ep3.sex="男";
[更多...]