GlobalAssemblyInfo.cs和强大的命名

时间:2009-04-03 15:11:30

标签: c# .net configuration-management

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

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

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

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

3 个答案:

答案 0 :(得分:2)

嗯,为避免路径问题,您可以使用[assembly:AssemblyKeyName(...)]代替(虽然IIRC也不推荐使用);使用sn -i安装命名密钥。每台机器(构建版本)都需要添加此密钥。

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

答案 1 :(得分:1)

关键签名的这些属性因为充分的理由而被弃用(信息泄露),这是进入项目路线的另一个原因。

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

答案 2 :(得分:1)

理查德对信息泄露提出了一个很好的观点 - 我现在已经找到了微软.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>

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