我知道 Visual Studio 2008 中有以下两种不同类型的 Web 项目:
- 网站项目
- 网络应用程序项目
只要 Web 应用程序的程序集也使用相同的 key 进行签名,Web 应用程序项目就可以引用已签名的程序集。但是,这不适用于网站项目,因为没有地方可以签署程序集。我认为这是因为程序集是在服务器上动态编译的?
无论如何,是否可以让网站项目与此签名的程序集一起工作?或者我是否必须将此网站项目转换为 Web 应用程序项目?
编辑:
以下情况需要我就此事请求澄清:
我的 Visual Studio 解决方案中的几个其他项目正在引用一个类库。其中一个项目是一个 Windows 应用程序,将部署给特定的外部用户。为了确保应用程序使用正确的程序集并防止其他人使用该程序集(我知道其有效性方面的限制),所有程序集都已签名,并且库中的所有类都已声明作为 friend (内部)。
网站项目似乎没有办法让我签署其程序集,并且在尝试使用库中的任何内容时收到以下消息:“CLASS 在这种情况下不可评估,因为它是‘Friend’” ,这是可以预料的。
以下属性位于我的类库项目中的 AssemblyInfo.vb 文件内:
<Assembly: InternalsVisibleTo("OtherProject1, PublicKey=AAA...")>
<Assembly: InternalsVisibleTo("OtherProject2, PublicKey=AAA...")>
...
我的结论:
看起来最简洁的方法是将网站转换为网络应用程序,但这需要一些时间,因为我们的网站已经相当充实,并且正如其他讨论中指出的那样,可能会相当耗时。做起来很痛苦。展望 future ,我认为首先创建一个 Web 应用程序可能是一个更好的主意,并且对于 future 的开发来说更加灵活。
最佳答案
这两个项目不需要使用相同的 key 进行签名 - 在所有框架程序集都使用 MS 的 key 进行签名之后,您无权访问该 key ,但您可以愉快地从网站和 Web 引用它们应用项目。
没有什么可以阻止您从网站项目引用已签名的程序集 - 您看到了什么错误?
<小时/>编辑添加
根据您更新的信息,是的,我认为您必须:
- 将网站转换为 Web 应用程序 - 正如您正确指出的那样,无法对网站进行签名,而且实际上,无法真正控制 ASP.NET 为网站生成的库。
- 编译两个版本的类库,一个已签名,另一个未签名。您或许可以使用条件编译来实现此目的。
编辑添加
我认为条件编译可能会很快变得困惑,但简而言之,它会像这样工作:
- 打开类库的“项目属性”,然后转到“构建”选项卡。
- 将“配置”下拉菜单切换为“所有配置”
- 在“条件编译符号”框中,添加新符号,例如“INTERNAL”。
转到您想要公开的类库,并将其修改为:
#if INTERNAL
internal class MyClass
#else
public class MyClass
#endif
{
[...]
}
然后,当您需要生成库的公共(public)版本时,从属性中删除“INTERNAL”符号并重新构建 - 您可以通过创建一组定义了此符号的新调试和发布配置来使此操作变得更容易,并使用“解决方案配置”下拉列表在它们之间切换。
潜在问题:
- 可能不容易判断您是否已定义符号 - 我不知道在 vanilla VS 中的行为是什么,但是安装了 ReSharper 后,它会将代码中不会出现的部分显示为灰色。 t 在当前符号集下进行编译,并在您键入时将该类标记为不可访问。
- 您需要将属性和方法保留为
public
,这样当您不将其构建为“INTERNAL”时,您就可以访问它们,但这看起来有点奇怪(尽管不会产生任何警告,因此显然是合法的)。
关于asp.net - 网站项目是否可以引用 Visual Studio 中签名的程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5488864/