7

我的解决方案的根目录中有一个 GlobalAssemblyInfo.cs 文件,其中有类似以下条目的内容,以启用对输出程序集的强命名。

#pragma warning disable 1699
[assembly : AssemblyKeyFile("..\\keyfile.snk")]
#pragma warning restore 1699

这种方法有两个缺点。首先,AssemblyKeyFileAttribute 已被弃用,因此为了避免编译警告,我需要您在上面看到的编译指示行。其次,我要么需要将我的所有项目相对于根目录保持相同的深度以使用相对路径,要么使用绝对路径,这决定了其他用户机器(以及持续集成服务器/构建代理)上的结帐位置.

除了在项目文件中通过每个项目设置强命名之外,有没有人有比这更好的解决方案?

4

3 回答 3

2

好吧,为了避免路径问题,您可以[assembly:AssemblyKeyName(...)]改用(尽管 IIRC 这也已被弃用);用于sn -i安装命名密钥。每台机器(进行构建)都需要添加此密钥。

除此之外; 是的,您可能需要编辑项目文件。

于 2009-04-03T15:18:40.757 回答
1

出于充分的理由(信息泄漏),不推荐使用密钥签名的这些属性,这是采用项目路线的另一个原因。

如果您有很多项目,则可以通过录制的宏来设置它们,甚至可以直接操作 .csproj 文件(确保它们首先从 VS 中卸载)。

于 2009-04-03T15:32:15.030 回答
1

Richard 对信息泄露提出了一个很好的观点——我现在找到了来自 Microsoft .NET 团队的帖子,他们在其中描述了这一点。所以我接受了他的建议并提出了以下 NAnt 目标:

  <target name="strongName" description="Strong names the output DLLs">
    <foreach item="File" property="filename">
      <in>
        <items>
          <include name="**/*.csproj"></include>
          <exclude name="**/*.Test.csproj"></include>
        </items>
      </in>
      <do>
        <echo message="${filename}" />
        <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:SignAssembly" value="false">
          <namespaces>
            <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
          </namespaces>
        </xmlpoke>
        <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:AssemblyOriginatorKeyFile" value="..\keyfile.snk">
          <namespaces>
            <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
          </namespaces>
        </xmlpoke>
      </do>
    </foreach>
  </target>

<namespaces> 元素对于在 csproj 文件中解析 XPath 是必需的 - 请注意,这是针对 VS2008 的,在 VS2005 中可能需要稍微不同的东西。

于 2009-04-03T16:07:54.087 回答