3

我知道 Visual Studio 2008 中有以下两种不同类型的 Web 项目:

  • 网站项目
  • 网络应用项目

只要 Web 应用程序的程序集也使用相同的密钥签名,Web 应用程序项目就可以引用已签名的程序集。但是,这不适用于网站项目,因为没有地方可以签署程序集。我认为这是因为程序集是在服务器上动态编译的?

无论如何,是否有可能让网站项目与这个签名的程序集一起工作?还是我必须将此网站项目转换为 Web 应用程序项目?

编辑:

以下情况需要我就此事要求澄清:

我有一个类库,在我的 Visual Studio 解决方案中被其他几个项目引用。其中一个项目是将部署到特定外部用户的 Windows 应用程序。为了确保应用程序使用正确的程序集并防止其他人使用该程序集(我知道关于其有效性的限制),所有程序集都已签名并声明了库中的所有类作为朋友(内部)。

该网站项目似乎没有办法让我签署它的程序集,并且在尝试使用库中的任何内容时收到以下消息:“CLASS 在这种情况下不可评估,因为它是'朋友'”,即可以预料。

以下属性位于我的类库项目的 AssemblyInfo.vb 文件中:

<Assembly: InternalsVisibleTo("OtherProject1, PublicKey=AAA...")>
<Assembly: InternalsVisibleTo("OtherProject2, PublicKey=AAA...")>
...

我的结论:

看起来最干净的方法是将网站转换为 Web 应用程序,但这需要一些时间,因为我们的网站已经非常充实,正如其他讨论中所指出的那样,可能会很痛苦做。展望未来,我认为首先创建一个 Web 应用程序可能是一个更好的想法,并且对于未来的开发更加灵活。

4

3 回答 3

1

这两个项目不需要使用相同的密钥进行签名 - 在所有框架程序集都使用 MS 的密钥进行签名之后,您无权访问但您可以愉快地从网站和 Web 应用程序项目中引用它们。

没有什么能阻止您从网站项目中引用已签名的程序集 - 您看到了什么错误?


编辑以添加

根据您更新的信息,是的,我认为您必须:

  1. 将网站转换为 Web 应用程序 - 正如您正确指出的那样,无法对网站进行签名,实际上,对 ASP.NET 将为该网站生成的库没有真正的控制权。
  2. 编译两个版本的类库,一个签名,另一个不签名。您可能可以使用条件编译来实现这一点。

编辑以添加

我认为条件编译可能很快就会变得混乱,但简而言之,它会像这样工作:

  • 打开类库的项目属性,然后转到构建选项卡。
  • 将“配置”下拉菜单切换到“所有配置”
  • 在“条件编译符号”框中,添加一个新符号,例如“INTERNAL”。

转到您要公开的类库,并将它们修改为:

#if INTERNAL
  internal class MyClass
#else
  public class MyClass
#endif
  {
    [...]
  }

然后,当您需要生成库的公共版本时,从属性中删除“INTERNAL”符号并重新构建 - 您可以通过创建一组定义了此符号的新调试和发布配置来简化此操作,并在他们使用解决方案配置下拉菜单。

潜在问题:

  1. 判断您是否定义了符号可能并不容易 - 我不知道 vanilla VS 中的行为是什么,但是安装了 ReSharper 后,它将使无法编译的代码部分变灰在当前的一组符号下,并在您键入时将该类标记为不可访问。
  2. 您需要保留您的属性和方法,public以便当您不将其构建为“内部”时,您可以访问它们,但这看起来有点奇怪(尽管不会产生任何警告,所以显然是合法的) .
于 2011-03-30T16:13:44.097 回答
1

现在我对这个问题有了更清晰的了解,我发现我的原始答案并不适用。我之前在类似情况下所做的是使用源代码管理将“朋友”类的代码文件分支到使用项目中,以便它们作为使用程序集的一部分进行编译。

在我的情况下,我试图在不同的服务器控制项目中重用一些代码而不将其放入单独的 dll 中,但我怀疑它也适用于您的网站场景。这意味着您的网站不需要引用签名的 DLL,因为这些类是作为网站的一部分编译的,因此所有内部声明都应该可供它使用。

我不知道这是否适合您,很大程度上取决于您使用的源代码控制工具、您如何设置代码存储库以及您对分支和合并概念的适应程度。

于 2011-03-31T12:15:36.067 回答
0

已签名程序集的公共成员应该可供任何其他有权访问 DLL 的项目使用。我创建了几个签名的程序集并将它们分发给我团队的其他成员,我们在网站、Web 项目和控制台应用程序中使用它们。我们遇到冲突的唯一地方是当我们尝试在控制台应用程序中使用引用 HttpContext.Current 的程序集时。如果我们避免使用使用此参考的方法,即使这样也有效。

签名/密钥应该成为问题的唯一情况是,如果您试图让他们成为“朋友”,这意味着他们可以看到彼此的内部类型和方法。关于朋友和签名的规则记录在这里:http: //msdn.microsoft.com/en-us/library/0tke9fxk.aspx

于 2011-03-30T16:36:50.150 回答