2013年5月 的存档
2013五月23

程序集引用

ASP.NET 评论关闭

1、.NET 框架支持两种程序集:强命名程序集(strongly named assembly)非强命名程序集。
      强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥对唯一地标识了程序集的发布者。利用公钥/私钥对我们可以对程序集进行唯一的标识、安全策略和版本策略。(由于简单地用文件名导致了目前所谓的DLL Hell,强命名程序集就是CLR用来唯一地标识一个程序集的机制。)

2、一个程序集有两种部署方式:私有方式和全局方式。
     非强命名程序集只能进行私有部署。
     全局部署方式将程序集部署在一些CLR确知的地方,当CLR搜索程序集时,它会知道到这些地方去查找。强命名程序集既可以进行私有部署,也可以进行全局部署。它提供多个应用程序域访问同一个程序集的能力,特别地,内存中只存在该程序集的同一份副本,这种非特定于域的代码共享极大节省了内存资源占用。并且,在大多数情况下,共享程序集安装在全局程序集高速缓冲存储器(Global Assembly Cache)中而不存在于应用程序相关目录下,对它的引用不会产生文件复制,自然也不会产生额外的副本。因而,共享程序集不能简单通过XCOPY命令实现部署,而应使用MSI(Microsoft Windows Installer)进行。当组件和主应用程序不由同一个开发商建立,或者一个大应用程序分布在几个小工程中时,常常需要使用共享程序集。

3,引用流程: 如果文件名包含了完整路径,则 CSC.exe 加载指定路径下的文件。如果指定的是不带路径的文件,它将在以下目录中查找引用的程序集:
       a、当前工作路径;
       b、编译器目前使用的CLR所在的目录。MSCorLib.dll总是包含在该目录中(System.Object就定义在这个程序集中)。该目录类似于:
       C:/Windows/Micorsoft.NET/Framework/v1.0.3427 ;
       c、任何用CSC.exe的 /lib 命令行开关指定的目录;
       d、任何LIB环境变量中指定的目录

       安装.NET框架时,微软的程序集文件会被分别拷贝到 CLR所在目录及 GAC目录中。在CLR所在目录中拷贝是使我们能够方便的生成自己的程序集;GAC中的拷贝则是用于运行时加载这些程序集。

       CSC.exe 不在GAC 中查找所引用的程序集的原因是因为需要指定的路径比较麻烦。
4,可用vs自带的合成日志查看器查看程序集加载过程

5,创建与部署:用SN工具生成强签名,用GACUti部署到全局,这样一个程序集可被多个应用程序访问

2013五月23

Could not load file or assembly (Exception from HRESULT: 0×80131040)

开发遇到的问题 评论关闭

编译出现这个错误:
Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0×80131040)

操作:使用微软企业库,修改了Microsoft.Practices.EnterpriseLibrary.Common.dll,Microsoft.Practices.EnterpriseLibrary.Data.dll
(一个知识点是修改了这种dll后,微软的强签名就没了,由PublicKeyToken=31bf3856ad364e35变成了PublicKeyToken=null)

问题引发场景:
新项目中引用了修改的企业库Common.dll,Data.dll,未改的企业库Caching.dll,问题就来了:
微软的企业库Caching.dll里面还是引用原来的带有强签名的Common.dll(可通过Reflector查看此引用),而我们在这个新项目中引用的是自己修改的Common.dll,在编译时造成Caching.dll找不到微软的Common.dll,从而引发上述错误。
解决方法:
1,修改Caching.dll,将其引用的Common.dll改为自已修改后的Common.dll
2,因本项目中没有用到Caching.dll的地方,去掉此Caching.dll,解决问题
3,因微软的Common.dll是强签名,可注册到GAC全局

注:
1,引用Common.dll的微软企业库还有
Microsoft.Practices.EnterpriseLibrary.Caching.Cryptography.dll
Microsoft.Practices.EnterpriseLibrary.Caching.Database.dll
Microsoft.Practices.EnterpriseLibrary.Caching.dll
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
2,一个被忽略的基本事实是:打包的dll如father.dll 里面引用了son.dll,那么在新项目中若引用father.dll,那么在bin下也要有son.dll的存在。

2013五月14

SQL Server Browser服务

sql server 评论关闭

在sqlserver服务器有一个名为SQL Server Browser的服务,一直没用到,最近一台服务器安装了多个实例,其中一个实例在外部怎么都访问不了,这时查资料才明白需要开启SQL Server Browser服务。
如果一个物理服务器上面有多个SQL Server实例,那么为了确保客户端能访问到正确的实例,所以SQL Server 2005以后提供了一个新的Browser服务。
参考:SQL Server : Browser服务是干什么的

2013五月4

附加数据库只有mdf文件无日志文件

sql server 评论关闭
--只有mdf文件,没有ldf文件,可通过选项来恢复。FOR ATTACH_REBUILD_LOG;
--有日志文件则附加上,若无,则新建
CREATE DATABASE AdventureWorks2012
ON (FILENAME = 'M:\Program Files\Microsoft SQL Server201201\MSSQL11.MSSQLSERVER\MSSQL\DATA\AdventureWorks2012_Data.mdf')
FOR ATTACH_REBUILD_LOG;