我試圖做一些事情有點不尋常...SGEN,InternalsVisibleTo和裝配簽署
我有這個類Foo:
public class Foo
{
public Foo(string name)
{
this.Name = name;
}
internal Foo()
{
}
public string Name { get; internal set; }
public int Age { get; set; }
}
通告姓名的內部setter和內部默認構造函數。這通常防止XML序列化,但我也標誌着XML序列化程序集爲「朋友」與InternalsVisibleTo:
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")]
而且我添加了一個MSBuild任務預先生成的序列化程序集:
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
<SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
</Target>
這工作正常:名稱屬性正確序列化和反序列化。
現在,我想籤我的組裝。所以我定義我的程序集密鑰文件,我修改InternalsVisibleTo聲明相匹配的關鍵:
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]
但現在SGEN失敗:
無法生成臨時類(結果= 1)。
屬性或索引「TestXML2008.Foo.Name」不能被分配到 - 它是隻讀
的SGEN任務應該選擇通過宏的密鑰文件,但顯然這還不夠...我也試圖在SGEN任務中明確指定密鑰文件,但沒有成功。我在命令行上使用sgen.exe時有相同的結果...
我錯過了什麼嗎?我無法理解爲什麼當我簽署程序集時它不起作用...
它的工作原理,謝謝!我被InternalsVisibleToAttribute的MSDN文檔中的示例誤導了:示例中顯示的關鍵字非常短,所以我認爲它是公鑰標記... – 2009-06-28 21:24:36