我不是.NET开发人员,因此可能会有一些基本的东西我不知道。
我有一些用C#编码的经验,但现在我有一个问题。我的一个项目(A)引用另一个ptoject(B),其中设置了“本地副本”。当B.dll与A.exe位于同一位置时,一切正常。但是当B.dll放在PATH的公共目录中时,它不起作用。
我的一位同事说他想我应该让B强烈签名。他是对的吗?这就是为什么人们会强烈签署集会的原因?
我在互联网上读到了一些内容,但我所看到的只是关于安全性......如果是这样,那么如何签署一个程序集以及它有什么后果?请注意我使用的是VS2003 .Net 1.1。
编辑 非常感谢您的回答,但是您提供的所有链接都指的是VS和.NET的更高版本,它们具有某种签名选项卡在项目属性中。有人知道(或给出一个链接)如何在VS2003 .Net1.1中强烈命名程序集?
答案 0 :(得分:5)
您的问题首先与程序集签名无关。 .NET不使用PATH环境变量来加载程序集。这个过程实际上有点复杂,你最好阅读MSDN中的所有细节(参见步骤1到4):
在您的情况下,最好将共享程序集安装到GAC。安装到GAC要求您的程序集具有强名称,因此这可能是您的同事所提到的。
<强>更新强>
正如您特别提到有关.NET 1.1程序集强命名的问题,我建议您查看以下问题:
答案 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。