我想做点不寻常的事.
我有这门课,福:
public class Foo
{
public Foo(string name)
{
this.Name = name;
}
internal Foo()
{
}
public string Name { get; internal set; }
public int Age { get; set; }
}请注意名称的内部设置程序和内部默认构造函数。这通常会阻止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失败了:
无法生成临时类(result=1)。 属性或索引器'TestXML2008.Foo.Name‘不能分配给--它是只读的。
SGEN任务应该通过宏选择密钥文件,但显然这还不够.我还试图在SGEN任务中显式地指定密钥文件,但没有成功。当我在命令行上使用sgen.exe时,结果是相同的.
我漏掉了什么吗?我不明白为什么当我在大会上签字的时候它不起作用..。
发布于 2009-06-28 18:42:03
在InternalsVisibleTo属性中,您需要指定完整的公钥,而不仅仅是公钥令牌。
有关如何获取公钥的信息,请参见对类似问题的回答和这篇MSDN文章。
https://stackoverflow.com/questions/1055382
复制相似问题