關於 DotNetBar for Windows Forms 11.8.0.8_冰河之刃重打包版
基於 官方原版的安裝包 + http://www.cnblogs.com/tracky 提供的補丁DLL制作而成。 安裝之后,直接就可以用了。 省心省事。不必再單獨的打一次補丁包了。
本安裝包和補丁包一樣都刪除了官方自帶的示例程序【我的文檔 中 已經編譯好的exe文件】。因為示例程序引用的是官方原版的DLL。處理過的DLL和原版DLL的強簽名不同,如果再打開示例程序就會報找不到對應強簽名的官方原版DLL的錯。索性刪除,省的大家再手動刪除!可用示例代碼再次編譯生成示例程序。 所以開始菜單中官方的 示例程序查看 鏈接方式打不開。這是正常的。因為沒有示例程序了。【感興趣的可以分析一下安裝目錄下面的RunDotNetBarSampleExplorer.exe文件,就會想明白了。】本安裝包和補丁包都依然保留了這一個鏈接。 在此說明和強調這一點!避免某些 小白用戶 說處理過的DLL或者是本安裝包有問題。
做事要低調!切勿隨意傳播,導致不必要的麻煩! 因使用本安裝包所導致的一切后果由使用者自身承擔,補丁DLL作者和安裝包作者皆不承擔任何責任!!!
本安裝包僅供學習使用,請在下載后24小時之內刪除。
安裝包里面的補丁DLL版權歸tracky所有。
本安裝包版權歸本人所有。
作者:冰河之刃 博客:http://www.cnblogs.com/binghe021 2014年7月25日 13:06:07 於上海
-----------------------------華麗的分隔線-----------------------------------------------------------------------------------------
發現tracky的博客上面並沒有發布出來DotNetBar for Windows Forms 11.8.0.8版本【他說當時好像博客園有故障發布不了】,今天下午靈感一現。
不如索性將處理過的補丁DLL直接打包到官方原版的安裝包里面,一次性安裝后就能直接使用那多方便呀。於是乎就有了這個安裝包。
俺上次做了一個11.8.0.4版本的補丁DLL,不過沒有刪除注冊表里面的殘余信息,所以安裝后工具箱有一點問題。多謝tracky的提示,在此表示感謝。
DotNetBar for Windows Forms 11.8.0.8_冰河之刃重打包版 下載地址:
鏈接: http://pan.baidu.com/s/1dD5Xu2t 密碼: n5bh
-----------------------------華麗的分隔線-----------------------------------------------------------------------------------------
做11.8.0.4版本的補丁DLL的時候產生了一個小工具。順帶發一下。
小工具功能:讀取同名但后綴名不同的配置文件 把指定的DLL從GAC中移除或添加到GAC中。靈活方便,更新軟件或做補丁包時可以用上。
配置文件類

/// <summary> /// 配置文件類 /// </summary> [Serializable] public class ConfigModel { public ConfigModel() { } /// <summary> /// 配置文件的名字 /// </summary> private string _configFileName; /// <summary> /// 要刪除的dll集合 /// </summary> private List<DllModel> _listDllModelsDel; /// <summary> /// 要添加的dll集合 /// </summary> private List<DllModel> _listDllModelsAdd; /// <summary> /// 要刪除的dll集合 /// </summary> public List<DllModel> ListDllModelsDel { get { return _listDllModelsDel; } set { _listDllModelsDel = value; } } /// <summary> /// 要添加的dll集合 /// </summary> public List<DllModel> ListDllModelsAdd { get { return _listDllModelsAdd; } set { _listDllModelsAdd = value; } } /// <summary> /// 配置文件的名字 /// </summary> public string ConfigFileName { get { //_configFileName ="AddGAC_MSIL"+ ".config"; return _configFileName; } set { _configFileName = value; } } }
Dll的Model信息

/// <summary> /// Dll的Model信息 /// </summary> [Serializable] public class DllModel { public DllModel() { } /// <summary> /// /// </summary> /// <param name="dllName"></param> /// <param name="version"></param> /// <param name="publicKeyToken"></param> public DllModel(string dllName, string version, string publicKeyToken) { DllName = dllName; PublicKeyToken = publicKeyToken; Version = version; } /// <summary> /// dll的文件名【不帶.dll的后綴名】 /// </summary> public string DllName { get; set; } /// <summary> /// 簽名PublicKeyToken /// </summary> public string PublicKeyToken { get; set; } /// <summary> /// 版本號 /// </summary> public string Version { get; set; } /// <summary> /// 獲取 版本號加上PublicKeyToken /// </summary> /// <returns></returns> public string GetVersionAddPublicKeyToken() { return Version + "__" + PublicKeyToken; } /// <summary> /// 獲取添加了.dll后綴的文件名 /// </summary> /// <returns></returns> public string GetDllNameWithDll() { return DllName + ".dll"; } /// <summary> /// 獲取最終的dll的路徑 如:【DevComponents.DotNetBar2\\11.8.0.4__7eb7c3a35b91de04\\DevComponents.DotNetBar2.dll】 /// </summary> /// <returns></returns> public string GetDllPath() { return DllName + "\\" + GetVersionAddPublicKeyToken() + "\\" + GetDllNameWithDll(); } /// <summary> /// 獲取第二級的文件夾名稱=dll的文件名加上版本號和PublicKeyToken 如:【DevComponents.DotNetBar2\\11.8.0.4__7eb7c3a35b91de04】 /// </summary> /// <returns></returns> public string GetDirPathTwo() { return DllName + "\\" + GetVersionAddPublicKeyToken(); } /// <summary> /// 獲取第一級文件夾的名稱=dll的文件名 如:【DevComponents.DotNetBar2】 /// </summary> /// <returns></returns> public string GetDirPathOne() { return DllName; } }
序列化幫助類

public class SerializeHelper<T> { public SerializeHelper() { } public static T Deserialze(byte[] buff) { T t; using (MemoryStream memoryStream = new MemoryStream(buff)) { memoryStream.Position = (long)0; t = (T)(new BinaryFormatter()).Deserialize(memoryStream); } return t; } public static byte[] Serialze(T t) { byte[] array; using (MemoryStream memoryStream = new MemoryStream()) { (new BinaryFormatter()).Serialize(memoryStream, t); array = memoryStream.ToArray(); } return array; } public static T StringDeserialze(string rs) { T t; try { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (XmlReader xmlReader = XmlReader.Create(new StringReader(rs))) { t = (T)xmlSerializer.Deserialize(xmlReader); } } catch { t = default(T); } return t; } public static string StringSerialze(T obj) { StringBuilder stringBuilder = new StringBuilder(); try { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder)) { xmlSerializer.Serialize(xmlWriter, obj); } } catch (Exception exception) { return exception.Message; } return stringBuilder.ToString(); } public static DataTable ToDataTable(IEnumerable<T> varlist) { object value; DataTable dataTable = new DataTable(); PropertyInfo[] properties = null; if (varlist == null) { return dataTable; } foreach (T t in varlist) { if (properties == null) { properties = t.GetType().GetProperties(); PropertyInfo[] propertyInfoArray = properties; for (int i = 0; i < (int)propertyInfoArray.Length; i++) { PropertyInfo propertyInfo = propertyInfoArray[i]; Type propertyType = propertyInfo.PropertyType; if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) { propertyType = propertyType.GetGenericArguments()[0]; } dataTable.Columns.Add(new DataColumn(propertyInfo.Name, propertyType)); } } DataRow dataRow = dataTable.NewRow(); PropertyInfo[] propertyInfoArray1 = properties; for (int j = 0; j < (int)propertyInfoArray1.Length; j++) { PropertyInfo propertyInfo1 = propertyInfoArray1[j]; DataRow dataRow1 = dataRow; string name = propertyInfo1.Name; if (propertyInfo1.GetValue(t, null) == null) { value = DBNull.Value; } else { value = propertyInfo1.GetValue(t, null); } dataRow1[name] = value; } dataTable.Rows.Add(dataRow); } return dataTable; } public static DataTable ToDataTable(T obj) { object value; DataTable dataTable = new DataTable(); if (obj == null) { return dataTable; } PropertyInfo[] properties = typeof(T).GetProperties(); PropertyInfo[] propertyInfoArray = properties; for (int i = 0; i < (int)propertyInfoArray.Length; i++) { PropertyInfo propertyInfo = propertyInfoArray[i]; Type propertyType = propertyInfo.PropertyType; if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) { propertyType = propertyType.GetGenericArguments()[0]; } dataTable.Columns.Add(new DataColumn(propertyInfo.Name, propertyType)); } DataRow dataRow = dataTable.NewRow(); PropertyInfo[] propertyInfoArray1 = properties; for (int j = 0; j < (int)propertyInfoArray1.Length; j++) { PropertyInfo propertyInfo1 = propertyInfoArray1[j]; DataRow dataRow1 = dataRow; string name = propertyInfo1.Name; if (propertyInfo1.GetValue(obj, null) == null) { value = DBNull.Value; } else { value = propertyInfo1.GetValue(obj, null); } dataRow1[name] = value; } dataTable.Rows.Add(dataRow); return dataTable; } public static T XMLDeserialze(string filePath) { T t; try { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (XmlReader xmlReader = XmlReader.Create(filePath)) { t = (T)xmlSerializer.Deserialize(xmlReader); } } catch { t = default(T); } return t; } public static void XMLSerialze(T obj, string filePath) { try { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (XmlWriter xmlWriter = XmlWriter.Create(filePath)) { xmlSerializer.Serialize(xmlWriter, obj); } } catch { } } }
Main方法所在類

public class Program { /// <summary> /// 要刪除的dll集合 /// </summary> private static readonly List<DllModel> listDllModelsDel = new List<DllModel>(); /// <summary> /// 要添加的dll集合 /// </summary> private static readonly List<DllModel> listDllModelsAdd = new List<DllModel>(); private static ConfigModel configModel = new ConfigModel(); private static readonly string path = AppDomain.CurrentDomain.BaseDirectory + "\\" + "AddGAC_MSIL_Log.log"; private static readonly FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read); private static readonly StreamWriter streamWriter = new StreamWriter(fileStream); public static void Main(string[] args) { streamWriter.WriteLine("--------------------------------------------------------------------------"); streamWriter.WriteLine("本工具可以讀取配置文件,靈活的刪除和添加GAC文件。" + "\r\n使用之前務必關掉Visual Studio工具,並且使用管理員權限運行。"); streamWriter.WriteLine("方便為程序打補丁,方便制做安裝包等等"); streamWriter.WriteLine("本工具由冰河之刃開發"); streamWriter.WriteLine("本人博客:http://www.cnblogs.com/binghe021"); streamWriter.WriteLine("--------------------------------------------------------------------------"); LoadConfig(); //InitDllModels(); GAC_MSIL_Del(); GAC_MSIL_Add(); streamWriter.Close(); fileStream.Close(); Console.WriteLine("文件注冊到GAC中完成"); Console.WriteLine("注冊日志在:"+path); Console.WriteLine("准備打開注冊日志"); Process.Start(path); Console.WriteLine("日志若顯示注冊到GAC中成功,則說明補丁應用成功"); Console.WriteLine("本補丁不會備份原文件【官方有限制版】,請注意。"); Console.ReadLine(); } /// <summary> /// 添加 /// </summary> private static void GAC_MSIL_Add() { streamWriter.WriteLine("開始添加 配置文件中 要添加到GAC中 的文件"); if (configModel.ListDllModelsAdd!=null && configModel.ListDllModelsAdd.Count>0) { foreach (DllModel dllModel in configModel.ListDllModelsAdd) { streamWriter.WriteLine(AddGacFile(dllModel)); } } streamWriter.WriteLine("添加完畢"); } /// <summary> /// 刪除 /// </summary> private static void GAC_MSIL_Del() { streamWriter.WriteLine("開始刪除 配置文件中 要刪除的 GAC中文件"); if (configModel.ListDllModelsDel != null && configModel.ListDllModelsDel.Count > 0) { foreach (DllModel dllModel in configModel.ListDllModelsDel) { streamWriter.WriteLine(DelGacFile(dllModel.GetDllPath())); streamWriter.WriteLine(DelGacDir(dllModel.GetDirPathTwo())); streamWriter.WriteLine(DelGacDir(dllModel.GetDirPathOne())); } } streamWriter.WriteLine("刪除完畢"); ////刪除本次要添加到GAC里面的DLL,不想覆蓋拷貝,避免產生不可預知的問題 ////不需要執行。因為在刪除的時候第一級的大文件夾的名字是相同的,所以會將一個dll的所有版本都刪除的。 //if (configModel.ListDllModelsAdd != null && configModel.ListDllModelsAdd.Count > 0) //{ // foreach (DllModel dllModel in configModel.ListDllModelsAdd) // { // streamWriter.WriteLine(DelGacFile(dllModel.GetDllPath())); // streamWriter.WriteLine(DelGacDir(dllModel.GetDirPathTwo())); // streamWriter.WriteLine(DelGacDir(dllModel.GetDirPathOne())); // } //} } /// <summary> /// 加載 /// </summary> private static void InitDllModels() { //del listDllModelsDel.Add(new DllModel("DevComponents.DotNetBar.Design", "11.8.0.4", "90f470f34c89ccaf")); listDllModelsDel.Add(new DllModel("DevComponents.DotNetBar.Keyboard", "11.8.0.4", "7eb7c3a35b91de04")); listDllModelsDel.Add(new DllModel("DevComponents.DotNetBar.Layout", "11.8.0.4", "7eb7c3a35b91de04")); listDllModelsDel.Add(new DllModel("DevComponents.DotNetBar.Layout.Design", "11.8.0.4", "7eb7c3a35b91de04")); listDllModelsDel.Add(new DllModel("DevComponents.DotNetBar.Schedule", "11.8.0.4", "7eb7c3a35b91de04")); listDllModelsDel.Add(new DllModel("DevComponents.DotNetBar.SuperGrid", "11.8.0.4", "7eb7c3a35b91de04")); listDllModelsDel.Add(new DllModel("DevComponents.DotNetBar2", "11.8.0.4", "7eb7c3a35b91de04")); listDllModelsDel.Add(new DllModel("DevComponents.Instrumentation", "11.8.0.4", "f90dc37c26666a67")); listDllModelsDel.Add(new DllModel("DevComponents.Instrumentation.Design", "11.8.0.4", "76cb4c6eb576bca5")); listDllModelsDel.Add(new DllModel("DevComponents.SuperGrid.Design", "11.8.0.4", "26d81176cfa2b486")); listDllModelsDel.Add(new DllModel("DevComponents.TreeGX", "11.8.0.4", "055db68f670cfeab")); //add listDllModelsAdd.Add(new DllModel("DevComponents.DotNetBar.Design", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.DotNetBar.Keyboard", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.DotNetBar.Layout", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.DotNetBar.Layout.Design", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.DotNetBar.Schedule", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.DotNetBar.SuperGrid", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.DotNetBar2", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.Instrumentation", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.Instrumentation.Design", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.SuperGrid.Design", "11.8.0.4", "86742bc79fd2768a")); listDllModelsAdd.Add(new DllModel("DevComponents.TreeGX", "11.8.0.4", "86742bc79fd2768a")); configModel.ListDllModelsDel = listDllModelsDel; configModel.ListDllModelsAdd = listDllModelsAdd; configModel.ConfigFileName = Process.GetCurrentProcess().MainModule.FileName + ".gfl"; SerializeHelper<ConfigModel>.XMLSerialze(configModel, configModel.ConfigFileName); } public bool SaveConfig() { bool isSaveOk = true; try { if (configModel != null) { configModel.ConfigFileName = Process.GetCurrentProcess().MainModule.FileName + ".gfl"; SerializeHelper<ConfigModel>.XMLSerialze(configModel, configModel.ConfigFileName); } } catch (Exception) { isSaveOk = false; } return isSaveOk; } public static bool LoadConfig() { configModel.ConfigFileName = Process.GetCurrentProcess().MainModule.FileName + ".gfl"; streamWriter.WriteLine("配置文件是"+configModel.ConfigFileName); bool isLoadOk = true; try { if (File.Exists(configModel.ConfigFileName)) { configModel = SerializeHelper<ConfigModel>.XMLDeserialze(configModel.ConfigFileName); streamWriter.WriteLine("讀取配置文件成功"); } else { streamWriter.WriteLine("沒有發現配置文件"); } } catch (Exception) { streamWriter.WriteLine("讀取配置文件失敗"); isLoadOk = false; } return isLoadOk; } #region GAC /// <summary> /// 刪除GAC中文件夾 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string DelGacDir(string str) { string environmentVariable = Environment.GetEnvironmentVariable("WINDIR"); environmentVariable = string.Concat(environmentVariable, "\\assembly\\GAC_MSIL\\", str); if (Directory.Exists(environmentVariable)) { Directory.Delete(environmentVariable, true); return str + " 文件夾從GAC中刪除成功"; } return str + " 文件夾在GAC未發現,不處理,已跳過"; } /// <summary> /// 刪除GAC中文件 /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static string DelGacFile(string fileName) { string environmentVariable = Environment.GetEnvironmentVariable("WINDIR"); environmentVariable = string.Concat(environmentVariable, "\\assembly\\GAC_MSIL\\", fileName); if (File.Exists(environmentVariable)) { File.Delete(environmentVariable); return fileName + " 從GAC中刪除成功"; } return fileName + " 文件未加入GAC,不處理,已跳過"; } /// <summary> /// 添加文件到GAC中 /// </summary> /// <param name="dllModel"></param> /// <returns></returns> public static string AddGacFile(DllModel dllModel) { try { string environmentVariable = Environment.GetEnvironmentVariable("WINDIR"); environmentVariable = string.Concat(environmentVariable, "\\assembly\\GAC_MSIL\\", Path.GetFileNameWithoutExtension(dllModel.GetDllNameWithDll())); Directory.CreateDirectory(environmentVariable); string str1 = environmentVariable; string[] strArrays = new string[] { str1, "\\", GetFileVersion(dllModel.GetDllNameWithDll()), "_", GetFileCultureInfo(dllModel.GetDllNameWithDll()), "_", dllModel.PublicKeyToken }; environmentVariable = string.Concat(strArrays); Directory.CreateDirectory(environmentVariable); File.Copy(dllModel.GetDllNameWithDll(), string.Concat(environmentVariable, "\\", Path.GetFileName(dllModel.GetDllNameWithDll())), true); } catch (Exception exception) { return dllModel.GetDllNameWithDll() + " 加入GAC失敗" + exception.Message; } return dllModel.GetDllNameWithDll()+" 加入GAC成功"; } public static string GetFileVersion(string str) { //Path.GetFileName(str); return AssemblyName.GetAssemblyName(str).Version.ToString(); } public static string GetFileCultureInfo(string str) { //Path.GetFileName(str); return AssemblyName.GetAssemblyName(str).CultureInfo.Name; } #endregion GAC }
小工具【AddGAC_MSIL】下載地址
感覺本文對你有用,請點個贊哦^_^,推薦一下下。
建議關注tracky的博客和本人博客,獲取最新的DotNetBar補丁及安裝包。