.net - SGEN、InternalsVisibleTo 和程序集签名

标签 .net xml-serialization strongname 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; }
}

注意 Name 的内部 setter 和内部默认构造函数。这通常会阻止 XML 序列化,但我还使用 InternalsVisibleTo 将 XML 序列化程序集标记为“ friend ”:

[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 属性已正确序列化和反序列化。

现在,我想签署我的程序集...因此我为程序集定义一个 key 文件,并修改 InternalsVisibleTo 声明以匹配该 key :

[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]

但是现在 SGEN 失败了:

Unable to generate a temporary class (result=1).
Property or indexer 'TestXML2008.Foo.Name' cannot be assigned to -- it is read only

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

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

最佳答案

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

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

关于.net - SGEN、InternalsVisibleTo 和程序集签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055382/

相关文章:

.net - XML 序列化,无空格

xml - XML的弱点是什么?

c# - 使用 XmlSerializer 重命名平面 xml 数组中的数组项

exception - 尝试使用 MoQ 时的 StrongNameKeyPair 问题

.net - 多个项目需要使用1个SNK文件

c# - IEqualityComparer 未按预期工作

.net - 在本地运行 Azure 模拟器以进行生产

.net - .NET 运行时如何定位非强命名的程序集?

c# - 主键冲突 : Inheritance using EF Code First

c# - .NET 的整数不就是简单地基于补码系统吗?