首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SGEN、InternalsVisibleTo和程序集签名

SGEN、InternalsVisibleTo和程序集签名
EN

Stack Overflow用户
提问于 2009-06-28 17:58:35
回答 1查看 2.9K关注 0票数 2

我想做点不寻常的事.

我有这门课,福:

代码语言:javascript
复制
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序列化程序集标记为“朋友”:

代码语言:javascript
复制
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")]

我还添加了一个MSBuild任务来预生成序列化程序集:

代码语言:javascript
复制
<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声明以匹配键:

代码语言:javascript
复制
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]

但现在SGEN失败了:

无法生成临时类(result=1)。 属性或索引器'TestXML2008.Foo.Name‘不能分配给--它是只读的。

SGEN任务应该通过宏选择密钥文件,但显然这还不够.我还试图在SGEN任务中显式地指定密钥文件,但没有成功。当我在命令行上使用sgen.exe时,结果是相同的.

我漏掉了什么吗?我不明白为什么当我在大会上签字的时候它不起作用..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-28 18:42:03

在InternalsVisibleTo属性中,您需要指定完整的公钥,而不仅仅是公钥令牌。

有关如何获取公钥的信息,请参见对类似问题的回答这篇MSDN文章

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1055382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档