【问题标题】:SGEN, InternalsVisibleTo and assembly signingSGEN、InternalsVisibleTo 和程序集签名
【发布时间】:2010-11-06 12:34:16
【问题描述】:

我正在尝试做一些不寻常的事情......

我有这个类 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 时,我得到了相同的结果...

我错过了什么吗?我不明白为什么在我签署程序集时它不起作用......

【问题讨论】:

    标签: .net xml-serialization strongname sgen internalsvisibleto


    【解决方案1】:

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

    有关如何获取公钥的信息,请参阅 this answer to a similar questionthis MSDN article

    【讨论】:

    • 它有效,谢谢!我被 InternalsVisibleToAttribute 的 MSDN 文档中的示例误导了:示例中显示的密钥很短,所以我认为它是公钥令牌...
    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2015-05-29
    • 1970-01-01
    • 2018-05-25
    • 2015-09-05
    相关资源
    最近更新 更多