BLOG zzy.my

合抱之木, 生于毫末; 九层之台, 起于累土; 千里之行, 始于足下。

Assembly generation failed -- 程序集生成失败 -- 引用的程序集没有强名称

什么叫强命名程序集?
我们知道,以前在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 之前 错误

错误内容:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记
引起原因:多线程异步调用或者创建新窗体时,出现该错误

解决方法:

1、修改main函数 ,前面添加[STAThread]标示(貌似IDE默认)
[STAThread]
static void Main()

 

[更多...]

C# 重写(override) 和 覆盖(new)

virtual 用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

例如,此方法可被任何继承它的类重写。虚拟成员的实现可由派生类中的 重写成员更改。

有关使用 virtual 的更多信息,参考微软 使用 Override 和 New 关键字进行版本控制

用关键字 virtual 修饰的方法,叫虚方法。在子类中用override 声明同名的方法,这叫“重写”。相应的没有用virtual修饰的方法,可以叫实方法

 

默认情况下,C# 方法为非虚方法。 如果某个方法被声明为虚方法,则继承该方法的任何类都可以实现它自己的版本。 若要使方法成为虚方法,必须在基类的方法声明中使用 virtual 修饰符。 然后,派生类可以使用 override 关键字重写基虚方法,或使用 new 关键字隐藏基类中的虚方法。 如果 override 关键字和 new 关键字均未指定,编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。

 

[更多...]

Ling List where() 笔记

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

[更多...]

C# 最快的大文件拷贝方法

转自 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以上。

 

[更多...]

释放 WMPLib

MSDN
释放 WMPLib 的资源

//定义
WindowsMediaPlayerClass wmp = new WindowsMediaPlayerClass();

//释放
public void DisposeWMPLib()
{
    if (wmp != null)
    {
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wmp);
        wmp = null;
        System.GC.Collect();
    }
}

 

[更多...]

ASP.NET 直接读取上传文件

<%@ 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;
    }

 

[更多...]

ArrayList Sort 排序

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="男";

 

[更多...]

C# 获取程序路径

获取运行程序路径的方法主要有以下7种: System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 他获取的是Module的文件名,如果在VS2008的调试环境中,获取的是 [程序名].vshost.exe的完整文件名。 System.Environment.CurrentDirectory System.IO.Directory.GetCurrentDirectory() 这两个方法获得的路径是一样的,获得的是当前路径,这个路径不一定是程序所在的路径。任何会改变当前路径的方法都会改变它,例如:OpenFileDialog每换一次目录就会改变它。因此,用这2个方法获取程序路径并不可靠。 . [更多...]