作者:黎波
日期:
[0] Patch 1475 用于解决在配置应用程序块(Configuration Application Block)中发现的内存泄漏问题。相关内容请看 Patch 1475 for Configuration Application Block released
[1] 为了让EntLib更好地在实际项目中使用,我们需要对EntLib进行一些修改。修改后的版本用于实际项目中,原来的版本用于学习。之所以要分两个版本,是因为当给EntLib的程序集加入强名称后,它们的全限定名称改变了,而EntLib的配置文件中需要指定各个EntLib程序集的全限定名称,这样就导致了所有基于原本的EntLib编写的应用,要经过手工修改所有配置文件中的程序集全限定名称后,才能正常使用,不然EntLib自带的配置工具会无法读取这些配置信息。
[2] 在根目录下执行
sn –k EntLib.snk (当然如果你的应用或项目已经有了自己的Key则可省略)
创建一个批处理文件(InstallSN.bat),里面可以就只有一句话,并且运行
sn -i EntLib.snk EntLibContainer
这样我们在强名的时候就可以不使用AssemblyKeyFile选项,因为它总是需要路径,Build的时候,经常会为这个相对路径搞来搞去。现在只要通过 AssemblyKeyName选项就可以指定了,不用担心路径问题。
[3] 在EntLib解决方案中有一个GlobalAssemblyInfo.cs 文件,每个项目都有一个自己的 AssemblyInfo.cs,GlobalAssemblyInfo.cs 保存着编译配置、公司/产品、版权声明和版本号,每个项目自己的AssemblyInfo则保存自己的Assembily名和CLR权限设置。
不必为每个项目的AssemblyInfo.cs文件加入强名称的代码,只要用文本编辑器打开GlobalAssemblyInfo.cs文件,并在其中加一句
[assembly : AssemblyKeyName("EntLibContainer")]
而不使用AssemblyKeyFile选项,然后保存GlobalAssemblyInfo.cs文件。
我是这样做的:打开EntLib解决方案,用VS自带的查找和替换功能将每个项目的AssemblyInfo.cs 中有关加强名称的三行代码注释掉
//[assembly : AssemblyDelaySign(false)]
//[assembly : AssemblyKeyFile("")]
//[assembly : AssemblyKeyName("")]
然后再给GlobalAssemblyInfo.cs 加入下面三行代码。
[assembly : AssemblyDelaySign(false)]
[assembly : AssemblyKeyFile("")]
[assembly : AssemblyKeyName("EntLibContainer ")]
[4] 在执行BuildLibrary.bat 文件之前,先用记事本打开它,将里面的
set buildType=Debug 修改为 set buildType=Release
确保 set visualStudioDir= 中的VS.NET 的安装路径正确。
[5] 在执行CopyAssemblies.bat 文件之前,先用记事本打开它,将里面的
set buildType=Debug 修改为 set buildType=Release
[6] 主要是生成一个批处理文件,将我们编译好的EntLib用Gacutil.exe工具安装到GAC中。通过修改EntLib原来目录下的InstallServices.bat文件,就可以变成非常合适的工具InstallAssemblyToGAC.bat。然后再修改一下就可以生成一个UninstallFromGAC.bat,这两个批处理修改路径之后还可以供开发人员使用二进制的EntLib时使用。
这里还有的一个可选操作是执行InstallServices /u ,我想这是建议的,之后我们要重新编译EntLib项目和注册,所以最好将之前InstallServices做的工作Uninstall。
[7] 运行之前生成的批处理将EntLib相关的程序集安装到GAC中。除了InstallServices.bat中包括的Assembly,我又增加下面一些Assembly:
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll
Microsoft.Practices.EnterpriseLibrary.Logging.Sinks.Database.dll
Microsoft.Practices.EnterpriseLibrary.Security.ActiveDirectory.dll
Microsoft.Practices.EnterpriseLibrary.Security.AzMan.dll
Microsoft.Practices.EnterpriseLibrary.Security.Cache.CachingStore.dll
Microsoft.Practices.EnterpriseLibrary.Security.Database.dll
Microsoft.Practices.EnterpriseLibrary.Security.Database.Authentication.dll
之后再运行InstallServices.bat 这样新的Enterprise Library就算安装上了。
[8] 为了在Visual Studio能够寻找到EntLib 和方便添加引用,我们需要在注册表的AssemblyFolders 中添加Enterprise Library的地址。可以参考MSDN Library或Johan Danforth的WebLog.
这样就方便多了,免得多次打开浏览窗口,一个目录一个目录的找了。之后将这个注册表的条目导出为文件(RegAddRefDialog.reg),修改之后复制到EntLib的根目录供其他人员使用。
[9] 通过上述的修改,现在EntLib根目录中有\bin 和 \src 两个目录,还有一些用于安装和部署EntLib的批处理文件、注册表项文件和强名称文件。
[参考]
将Enterprise Library 放到你的应用或产品中 ccBoy(小气的神)
http://www.dotnettools.org/2005/doc/entlib/EntLib001.htm