强烈签署的集会

时间:2010-11-16 10:35:40

标签: c# .net

我不是.NET开发人员,因此可能会有一些基本的东西我不知道。

我有一些用C#编码的经验,但现在我有一个问题。我的一个项目(A)引用另一个ptoject(B),其中设置了“本地副本”。当B.dll与A.exe位于同一位置时,一切正常。但是当B.dll放在PATH的公共目录中时,它不起作用。

我的一位同事说他我应该让B强烈签名。他是对的吗?这就是为什么人们会强烈签署集会的原因?

我在互联网上读到了一些内容,但我所看到的只是关于安全性......如果是这样,那么如何签署一个程序集以及它有什么后果?请注意我使用的是VS2003 .Net 1.1。

编辑 非常感谢您的回答,但是您提供的所有链接都指的是VS和.NET的更高版本,它们具有某种签名选项卡在项目属性中。有人知道(或给出一个链接)如何在VS2003 .Net1.1中强烈命名程序集?

5 个答案:

答案 0 :(得分:5)

您的问题首先与程序集签名无关。 .NET不使用PATH环境变量来加载程序集。这个过程实际上有点复杂,你最好阅读MSDN中的所有细节(参见步骤1到4):

  

<强> How the Runtime Locates Assemblies

在您的情况下,最好将共享程序集安装到GAC。安装到GAC要求您的程序集具有强名称,因此这可能是您的同事所提到的。

<强>更新

正如您特别提到有关.NET 1.1程序集强命名的问题,我建议您查看以下问题:

  

<强> How to give a .NET 1.1 dll a strong name in VS2003

答案 1 :(得分:2)

我认为你的同事可能指的是“强力命名”大会。 强命名使您可以将程序集部署到GAC。

一旦它在GAC中,那么使用该程序集的任何应用程序都可以始终找到它。 Path是无关紧要的,这是部署共享程序集的首选方法。

要强烈命名程序集,可以使用Visual Studio附带的sn.exe tool生成强名称,然后使用通过sn.exe生成的密钥文件对程序集进行签名。

编辑:如何使用SN.exe强制命名程序集的示例是here

另外,我认为您应该了解运行时如何加载程序集。来自MSDN

  

运行时使用以下步骤来解析程序集引用:

     

通过检查适用的方法确定正确的装配版本   配置文件,包括应用程序配置文件,   发布者策略文件和计算机配置文件。

     

如果配置文件位于远程计算机上,则   运行时必须找到并下载应用程序配置文件   第一

     

检查程序集名称是否已绑定到之前,如果是,   使用以前加载的程序集。

     

检查全局程序集缓存。如果在那里找到组件,那么   运行时使用此程序集。

     

使用以下步骤进行装配探测:如果配置   和发布商政策不影响原始参考,如果   绑定请求是使用Assembly.LoadFrom方法创建的   运行时检查位置提示。

     

如果在配置文件中找到代码库,则运行时会检查   只有这个位置。如果此探测失败,则运行时确定   绑定请求失败,没有其他探测发生。

     

使用探测中描述的启发式探测装配   部分。如果在探测之后未找到装配,则运行时   请求Windows Installer提供程序集。这充当了   按需安装功能。

     

注意:没有强大的程序集没有版本检查   名称,运行时也不检查全局程序集缓存   没有强名的集会。

答案 2 :(得分:1)

执行此操作的正确方法是在GAC中部署.dll。 http://support.microsoft.com/kb/815808

答案 3 :(得分:1)

您希望将B.dll放在公共目录中的原因是什么?是因为它可以被另一个程序使用吗?如果是这样,将其添加到GAC是最佳选择。见this一个

答案 4 :(得分:1)

正如0xA3已经提到过的,你应该阅读MSDN上的文章。但是文章中解释的不是AssemblyResolve事件的用法。如果框架没有在任何地方找到程序集,那么它将被抛出,让你有机会开始搜索自己(可能在你的公共文件夹中)并返回所需的程序集。

有关如何使用此功能的示例,请参阅my question here