强名称程序集

4

我不是.NET开发者,所以可能有一些基本的东西我不知道。

我有一些使用C#编程的经验,但现在我有一个问题。我的一个项目(A)引用了另一个项目(B),并设置为“本地副本”。当B.dll与A.exe在同一位置时,所有的东西都能正常工作。但是当B.dll被放在PATH的公共目录中时,它就无法工作。

我的一个同事说他认为我应该让B强制签名。他是正确的吗?这就是为什么会强制签名程序集的原因吗?

我在网络上读了一些相关资料,但我看到的都是关于安全方面的内容......如果是这样的话,如何签名程序集,这会带来什么后果?请注意,我正在使用VS2003 .Net 1.1。

编辑:非常感谢大家的回答,但你们提供的所有链接都是针对后来版本的VS和.NET,其中有一些属性标签能进行签名。有人知道(或给一个链接)如何在VS2003 .Net1.1中强制命名程序集吗?

5个回答

5

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

运行时如何定位程序集

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

更新:

由于您特别提到了.NET 1.1程序集的强命名,我建议查看以下问题:

如何在VS2003中为.NET 1.1 dll指定强名称


2
我认为你的同事所指的可能是“强名称”一个程序集。 强命名是使您能够将程序集部署到GAC中的方法。 一旦它在GAC中,那么使用该程序集的任何应用程序都可以始终找到它。路径不重要,这是共享程序集部署的首选方式。
要强名称一个程序集,您可以使用随Visual Studio提供的sn.exe工具生成强名称,然后使用通过sn.exe生成的密钥文件对程序集进行签名。
编辑:如何使用SN.exe强名称程序集的示例在这里
此外,我认为您应该了解运行时如何加载程序集。请参阅MSDN
运行时使用以下步骤来解析程序集引用:
通过检查适用的配置文件(包括应用程序配置文件、发布者策略文件和机器配置文件)确定正确的程序集版本。
如果配置文件位于远程计算机上,则运行时必须先定位并下载应用程序配置文件。
检查程序集名称是否已经被绑定过,如果是,则使用之前加载的程序集。
检查全局程序集缓存。如果在其中找到程序集,则运行时使用该程序集。
使用以下步骤探测程序集:如果配置和发布者策略不影响原始引用,并且绑定请求是使用Assembly.LoadFrom方法创建的,则运行时会检查位置提示。
如果在配置文件中找到代码库,则运行时仅检查该位置。如果此探测失败,则运行时确定绑定请求失败,并且不进行其他探测。
使用在探测部分中描述的启发式方法探测程序集。如果探测后未找到程序集,则运行时请求Windows Installer提供程序集。这相当于一种按需安装功能。
注意:对于没有强名称的程序集,没有版本检查,运行时也不会在全局程序集缓存中检查没有强名称的程序集。

@Armen - 两个链接已更新为.NET 1.1。注意:大多数情况下,这种用法与1.1版本没有区别,因此任何其他链接在任何情况下都应该基本相同。 - Jagmag
@Armen - 我还添加了一个MSDN链接,其中包含如何使用SN.exe的步骤。 - Jagmag
@InSame:还有一个问题,对还是错:Gac 是本地计算机/操作系统的,所以如果我想将程序集放入 GAC,我需要在每台计算机上都这样做。 这些信息不包含在程序集本身中。正确吗? - Armen Tsirunyan
1
@Armen - 确实。对于一个厚客户端应用程序来说,这最好是在安装时由您的部署包执行的操作。您可以使用gacutil工具来完成相同的操作。 - Jagmag

1

1

你想把B.dll放在公共目录的原因是什么?是因为它可以被另一个程序使用吗?如果是这样,将其添加到全局程序集缓存(GAC)是最好的选择。请参见this


1

正如0xA3所提到的,您应该阅读MSDN上的文章。但是文章中没有很好地解释AssemblyResolve事件的使用方法。如果框架在任何地方都没有找到程序集,它将被抛出,给您一个机会自己开始搜索(也许在您的公共文件夹中),并返回所需的程序集。

如何使用此功能的示例可以在我的问题中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接