我正在尝试做一些不寻常的事情......
我有这堂课Foo:
public class Foo
{
public Foo(string name)
{
this.Name = name;
}
internal Foo()
{
}
public string Name { get; internal set; }
public int Age { get; set; }
}
注意Name的内部setter和内部默认构造函数。这通常会阻止XML序列化,但我还使用InternalsVisibleTo将XML序列化程序集标记为“朋友”:
[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>
这很好用:Name属性被正确序列化和反序列化。
现在,我想签署我的程序集......所以我为程序集定义了一个密钥文件,并修改了InternalsVisibleTo声明以匹配密钥:
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]
但现在SGEN失败了:
无法生成临时类(结果= 1) 无法将属性或索引器“TestXML2008.Foo.Name”分配给 - 它是只读的
SGEN任务应该通过宏选择密钥文件,但显然这还不够......我还尝试在SGEN任务中明确指定密钥文件,但没有成功。当我在命令行上使用sgen.exe时,我得到了相同的结果...
我错过了什么吗?我无法理解为什么当我签署集会时它不起作用......
答案 0 :(得分:3)
在InternalsVisibleTo属性中,您需要指定完整的公钥,而不仅仅是公钥标记。
有关如何获取公钥的信息,请参阅this answer to a similar question和this MSDN article。