C#引用的集合不是强名是怎么回事

C#引用的集合不是强名是怎么回事,第1张

你把项目A换一个名字吧~可能与其它命名空间有冲突~即有同名

名称程序集的标识——其简单文本名称、版本号和区域性信息(如果提供)——加上公钥和数字签名组成。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。Microsoft® Visual Studio NET® 和在 NET 框架 SDK 中提供的其他开发工具能够将强名称分配给一个程序集。强名称相同的程序集应该是相同的。

通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:

强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。

强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。

强名称提供可靠的完整性检查。通过 NET 框架安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含某一级别的信任,例如由数字签名和支持证书提供的信任。

在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集(后者没有这些好处),则您将失去使用具有强名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。

下面的方案说明了使用强名称对程序集签名及以后按照该名称引用它的过程。

使用以下方法之一创建具有强名称的程序集 A:

使用支持创建强名称的开发环境,例如 Visual Studio NET。

使用强名称工具 (Snexe) 创建加密密钥对,并使用命令行编译器或程序集链接器 (Alexe) 将该密钥对分配给程序集。NET 框架 SDK 同时提供 Snexe 和 Alexe。

开发环境或工具使用开发人员私钥对包含程序集清单的文件哈希签名。数字签名存储在包含程序集 A 的清单的可移植可执行 (PE) 文件中。

程序集 B 是程序集 A 的使用者。程序集 B 的清单的引用部分包括代表程序集 A 公钥的标记。标记是完整公钥的一部分,并且这种标记(而不是密钥本身)可用于节省空间。

公共语言运行库在程序集置于全局程序集缓存时验证强名称签名。当运行时强名称进行绑定时,公共语言运行库会将存储在程序集 B 的清单中的密钥与用于为程序集 A 生成强名称的密钥进行比较。如果 NET 框架安全检查通过并且绑定成功,则程序集 B 可保证程序集 A 的位未被篡改,而这些位实际来自程序集 A 的开发人员。

注意 此方案不处理信任问题。程序集除强名称外,还带有完整的 Microsoft® Authenticode® 签名。Authenticode 签名包括建立信任的证书。请注意,强名称不要求以这种方式为代码签名,这一点非常重要。事实上,用于生成强名称签名的密钥不必与用于生成 Authenticode 签名的密钥相同。

版本 2

支持库 eAPI

支持库 dp1程序集 窗口程序集1

程序集变量 私钥, 文本型

程序集变量 公共模数, 文本型

程序集变量 公钥, 文本型

程序集变量 硬件号, 字节集

程序集变量 注册码, 字节集子程序 __启动窗口_创建完毕编辑框1内容 = 到文本 (取本机网卡物理地址 ())

硬件号 = 到字节集 (编辑框1内容)

公钥 = “36863”

公共模数 = “556525229715EE0DC9AB96A4777BAEC9D1220B994666800B47699FEE7361E9A7F1959EBF9570A9F31282D0E0BEDE91408ABC70E0D89FFD1565059DEA1AE066BB11A2D9C588DAD861642FCB6B0E34FE1F8CABC59BEE577F874EE1E0296F0C6BCF9826BA60C20AEA0DE2DF0392EAC66C0C0FB4A65748E8579A231051D17D9128A1”

子程序 _按钮1_被单击注册码 = 到字节集 (编辑框2内容)

判断开始 (签名验证 (到字节集 (编辑框1内容), 编辑框2内容, 公钥, 公共模数))

信息框 (“注册成功!”, 0, )

默认

信息框 (“注册失败!”, 0, )

判断结束

子程序 _按钮2_被单击私钥 = “13A06DC7B742C21E237A68C0D924A821F9864EC2AE5EDC7A263C19D0690387C8EF75BB451051531C4CEB178AC8B7E8A9E05B690A407660756A11B20369E08FB417019A6FA47DDA744B50FD8F086D5B6C4DE1D8EFC3CC14C2656988F67D20911165EB104E4EC7DF4DCFB51FA3D4A47FE60E874F8FD60A56118A5D98C81A7C5527”

编辑框3内容 = 数字签名 (硬件号, 私钥, 公共模数)

1,在vs2005中新建一个工程,如testtools,项目类型选择windows应用程序。

2,在windows form上面拖入一个文件浏览的botton,和一个文本框,然后在botton的事件上面录入如下代码:

/// <summary>

        /// 浏览按钮

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button1_Click(object sender, EventArgs e)

        {

            thisopenFileDialog1Filter="可执行文件|exe";

            thisopenFileDialog1ShowDialog();

            thistextBox1Text = thisopenFileDialog1FileNameTrim();

            if (thistextBox1TextTrim() == stringEmpty)

            {

                MessageBoxShow("选择文件,文件类型为dll或者exe", "数慧测试平台");

                return;

            }

           return;

        }

3,在windows form上面拖入普通的botton,然后在botton的事件上面录入如下代码:

/// <summary>

        /// 获取引用列表

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button2_Click(object sender, EventArgs e)

        {

            if (thistextBox1TextTrim() == stringEmpty)

            {

                MessageBoxShow("请先选择文件", "数慧测试平台");

                return;

            }

           

            if (thisradioButton1Checked == true)

            {

             //这里将程序引用信息写入到txt中,读者可以自定义。

                TestLogManager testlog = new TestLogManager();

                StreamWriter swriter = testloggetStreamwriter(ApplicationStartupPath + "//安装测试//" + "程序引用日志txt");

                swriterWriteLine("引用dll名称/t" + "版本/t" + "公钥");

                

                

                IList<string> pList = new List<string>();

                ArrayList pList2 = new ArrayList();

                try

                {

                    Assembly asscembly = AssemblyLoadFile(thistextBox1TextTrim());//装载程序集

                    GetAssemblysRecurse(asscembly, pList, pList2);

                    //对输出结果进行排序

                    pList2Sort(new myReverserClass());

                    foreach (AssemblyName pAssemblyNameReferenced in pList2)

                    {

                        // 获得程序引用的名称

                        swriterWriteLine("" + pAssemblyNameReferencedName + "/t" + pAssemblyNameReferencedVersion + "/t" + pAssemblyNameReferencedKeyPair);

                    }

                }

                finally

                {

                    swriterClose();

                }

                MessageBoxShow("完成!" + "请查看:" + ApplicationStartupPath + "//安装测试//程序引用日志txt", "数慧测试平台");

                return;

            }

            else

            {

                return;

            }

        }

        /// <summary>

        /// 排序方法

        /// </summary>

        public class myReverserClass : IComparer

        {

            int IComparerCompare(object x, object y)

            {

                return (x as AssemblyName)NameCompareTo((y as AssemblyName)Name);

            }

        }

        /// <summary>

        /// 递归函数,递归获得程序集合名称,然后写入日志中。

        /// </summary>

        /// <param name="swriter"></param>

        /// <param name="asscembly"></param>

        /// <param name="pList"></param>

        private void GetAssemblysRecurse(Assembly asscembly, IList<string> pList, ArrayList pList2)

        {

            AssemblyName[] assemblyname = asscemblyGetReferencedAssemblies();//获得引用程序集

            foreach (AssemblyName pAssemblyNameReferenced in assemblyname)

            {

                Assembly pAssemblyReferenced = null;

                //先从公共的Assembly中检查是否存在相应的dll,如:C:/WINDOWS/assembly

                try

                {

                    pAssemblyReferenced = AssemblyLoad(pAssemblyNameReferenced);

                }

                catch (Exception)

                {

                }

                //从可执行的exe下面检查是否存在相应的dll

                if (pAssemblyReferenced == null)

                {

                    try

                    {

                        

                        pAssemblyReferenced = AssemblyLoadFile(PathGetDirectoryName(thistextBox1TextTrim()) +

                            PathDirectorySeparatorChar + pAssemblyNameReferencedName + "dll");

                    }

                    catch (Exception)

                    {

                    }

                }

                //如果存在引用的dll,然后判断是否为系统的dll。

                if (pAssemblyReferenced != null)

                {

                    if (pAssemblyNameReferencedNameIndexOf("Test_ms") > -1 ||

                        pAssemblyNameReferencedNameIndexOf("Test_System") > -1||

                        pAssemblyNameReferencedNameIndexOf("test_office") > -1||

                        pAssemblyNameReferencedNameIndexOf("test_Interop") > -1)

                    {

                        continue;

                    }

                    //如果plist中不存在,则添加。

                    if (pListIndexOf(pAssemblyNameReferencedName) == -1)

                    {

                        pListAdd(pAssemblyNameReferencedName);                                     

                       //将程序集添加到plist2中,plist2主要是用来排序。

                        pList2Add(pAssemblyNameReferenced);

                        //执行递归方法

                        GetAssemblysRecurse(pAssemblyReferenced, pList, pList2);

                    }

                }

            }

        }

4,编译工程,然后执行exe即可获得引用的程序集列表。

VS2005或VS2008提供了给程序集签名的功能,就是“强命名程序集”,简单的说一旦有人修改了这个程序集就无法再使用!它采用的是“公钥/私钥对“加密算法,只要没人知道你的私钥,任何人都无法修改你的程序集。

以上就是关于C#引用的集合不是强名是怎么回事全部的内容,包括:C#引用的集合不是强名是怎么回事、易语言激活码及验证码代码怎么写、如何快速获得.net程序引用的程序集等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9614120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存