我在我的解决方案的根目录中有一个GlobalAssemblyInfo.cs文件,我有类似下面的条目来启用输出程序集的强命名。
#pragma warning disable 1699
[assembly : AssemblyKeyFile("..\\keyfile.snk")]
#pragma warning restore 1699
这种方法有两个缺点。首先,不推荐使用AssemblyKeyFileAttribute,因此为避免编译警告,我需要您在上面看到的编译指示行。其次,我要么将所有项目保持在相对于根的相同深度以使用相对路径,要么使用绝对路径,这决定了其他用户机器上的结账位置(以及持续集成服务器/构建代理)
除了在项目文件中设置强命名的每个项目之外,是否有人有比这更好的解决方案?
答案 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中可能需要稍微不同的东西。