-- 作者:admin
-- 发布时间:11/9/2004 2:25:00 AM
-- 晚上没事干,把ComponentONE.NET剁了...
发信人: flier (小海 [浮沉随浪 记今朝]), 信区: DotNET 标 题: 晚上没事干,把ComponentONE.NET剁了... 发信站: BBS 水木清华站 (Mon Nov 3 23:52:45 2003), 转信 http://www.componentone.com/Products.aspx?ProductCode=1 C# Builder自带的一套for .NET控件,做的还不错,WinForm和Web的都有 可惜要注册因此一直懒得用...直到今天有空有心情... 发现.NET的注册机实在是好写...稍微看一下IL代码就搞定 不过没有仔细检查,只确认了在IDE和程序运行时没问题, 不知道发布出去会不会有什么不同,呵呵,欢迎反馈 用户名和公司随便填, WinForm控件S8开头如S8202KP-TA-E3E7VD Web控件S9开头如S9202UP-P3-T6JQB2 注册码生成核心代码如下: using System; using System.Text; using System.Globalization; using System.Reflection; using System.Diagnostics; namespace C1KeyGen { struct AssemblyVersionInfo { public string VersionString; // GX; public int Major; // GY public int Minor; // GZ public int Build; // H0 public int Year; // H1 public int Month; // H2 } /// <summary> /// serial number length = 17 /// /// starts with "SE" / "S8" / "S9", "SE" may be mean "eval" /// </summary> public class KeyGen { StringBuilder sbTransTable = null; static readonly string ASCII_TABLE = "23456789ABCDEFGHJKLMNPQRSTUVWXY"; public KeyGen() { buildTransTable(); } public string generate(Assembly asm, bool web) { StringBuilder sb = new StringBuilder(17, 17); sb.Append(web ? "S9" : "S8"); AssemblyVersionInfo verInfo = getAssemblyVersionInfo(asm); int Part1 = verInfo.Year * 4 + verInfo.Month - 4; sb.Append((Part1 % 4).ToString("D1")); sb.Append((Part1 / 4 - 2000).ToString("D2")); byte[] data = new byte[7 - sb.Length + 6]; new Random().NextBytes(data); int idx = 0; for(int i=sb.Length; i<7; i++) { sb.Append(ASCII_TABLE[data[idx++] % ASCII_TABLE.Length]); } StringBuilder sb2 = new StringBuilder(); for(int i=idx; i<data.Length; i++) { sb2.Append(ASCII_TABLE[data[i] % ASCII_TABLE.Length]); } string checksum = calc(sb.ToString(), sb2.ToString()); sb.Append('-').Append(checksum).Append('-').Append(sb2.ToString()); return isValid(sb.ToString()); } private bool inRange(string sn, int min, int max) { int value = Int32.Parse(sn, CultureInfo.InvariantCulture); return min <= value && value <= max; } private void buildTransTable() { sbTransTable = new StringBuilder(ASCII_TABLE); for(int i=1; i<sbTransTable.Length; i++) { char ch = sbTransTable[i-1]; int k = 0; for(int j=1; j<sbTransTable.Length; j++) { if(((i * j) % sbTransTable.Length) == 1) { k = j; break; } } if(i < k) { sbTransTable[i-1] = sbTransTable[k-1]; sbTransTable[k-1] = ch; } } } private string calc(string p1, string p2) { StringBuilder sb1 = new StringBuilder(p1); sb1.Append(p2); StringBuilder sb2 = new StringBuilder(); for(int i=0; i<2; i++) { int k = 0; for(int j=0; j<sb1.Length; j++) { k += (j ^ (i + 1)) * sb1[j]; } sb2.Append(sbTransTable[k % sbTransTable.Length]); } return sb2.ToString(); } private string isValid(string sn) { Debug.Assert(sn.Length == 17); Debug.Assert(inRange(sn.Substring(2, 1), 1, 4)); Debug.Assert(inRange(sn.Substring(3, 1), 0, 9)); Debug.Assert(inRange(sn.Substring(4, 1), 0, 9)); Debug.Assert(sn.Substring(8, 2).Equals(calc(sn.Substring(0, 7), sn.Substring(11, 6)))); return sn; } private AssemblyVersionInfo getAssemblyVersionInfo(Assembly asm) { AssemblyVersionInfo info; info.VersionString = ((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyFileVersionAttribute))).Version; string[] ver = info.VersionString.Split(new char[] {'.', ' '}); info.Major = Int32.Parse(ver[0], CultureInfo.InvariantCulture); info.Minor = Int32.Parse(ver[1], CultureInfo.InvariantCulture); info.Build = Int32.Parse(ver[3], CultureInfo.InvariantCulture); int DateVer = Int32.Parse(ver[2], CultureInfo.InvariantCulture); info.Year = DateVer / 10; info.Month = DateVer % 10; return info; } } } -- . 生命的意义在于 /\ ____\ /\_ \ /\_\ . . 希望 \ \ \___/_\/\ \ \/_/__ __ _ _★ . . 工作 \ \ ____\\ \ \ /\ \ /'__`\ /\`'_\ . . 爱你的人 \ \ \___/ \ \ \___\ \ \/\ __// \ \ \/ . . 和你爱的人 \ \___\ \ \_____\ \__\ \____\ \ \_\ . . …… \/___/ \/_____/\/__/\/____/ \/_/ @nsfocus.com. ※ 修改:·flier 于 Nov 3 23:53:03 修改本文·[FROM: 211.167.254.72] ※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.167.254.72] 上一篇 返回上一页 回到目录 回到页首 下一篇
|