2009-06-28 62 views
2

我試圖做一些事情有點不尋常...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; } 
} 

通告姓名的內部setter和內部默認構造函數。這通常防止XML序列化,但我也標誌着XML序列化程序集爲「朋友」與InternalsVisibleTo:

[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> 

這工作正常:名稱屬性正確序列化和反序列化。

現在,我想籤我的組裝。所以我定義我的程序集密鑰文件,我修改InternalsVisibleTo聲明相匹配的關鍵:

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

但現在SGEN失敗:

無法生成臨時類(結果= 1)。
屬性或索引「TestXML2008.Foo.Name」不能被分配到 - 它是隻讀

的SGEN任務應該選擇通過宏的密鑰文件,但顯然這還不夠...我也試圖在SGEN任務中明確指定密鑰文件,但沒有成功。我在命令行上使用sgen.exe時有相同的結果...

我錯過了什麼嗎?我無法理解爲什麼當我簽署程序集時它不起作用...

回答

3

在InternalsVisibleTo屬性中,您需要指定完整的公鑰,而不僅僅是公鑰標記。

有關如何獲取公鑰的信息,請參閱this answer to a similar questionthis MSDN article

+0

它的工作原理,謝謝!我被InternalsVisibleToAttribute的MSDN文檔中的示例誤導了:示例中顯示的關鍵字非常短,所以我認爲它是公鑰標記... – 2009-06-28 21:24:36