2009-06-28 12 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; } 
} 

お知らせ内部セッター、および内部デフォルトコンストラクタ。これは、通常、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を使用すると、同じ結果が得られます...

私に何か不足していますか?アセンブリに署名するときになぜうまくいかないのか分かりません...

答えて

3

InternalsVisibleTo属性では、公開鍵トークンだけでなく完全な公開鍵を指定する必要があります。

公開鍵を取得する方法については、this answer to a similar questionおよびthis MSDN articleを参照してください。

+0

ありがとうございます!私はInternalsVisibleToAttributeのMSDNドキュメントの例で誤解されました。例に示されているキーは非常に短かったので、公開キートークンだと思いました... –

関連する問題