2

ちょっと変わったことをしようと...

私はこのクラス 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 の内部セッターと、内部のデフォルト コンストラクターに注意してください。これにより、通常は 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>

これは正常に機能します。Name プロパティは正しくシリアル化および逆シリアル化されます。

アセンブリに署名したいので、アセンブリのキー ファイルを定義し、キーに一致するように InternalsVisibleTo 宣言を変更します。

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

しかし、今 SGEN は失敗します:

一時クラスを生成できません (結果 = 1)。
プロパティまたはインデクサー 'TestXML2008.Foo.Name' を割り当てることができません -- 読み取り専用です

SGEN タスクはマクロを介してキー ファイルを選択する必要がありますが、明らかにそれだけでは十分ではありません... また、SGEN タスクでキー ファイルを明示的に指定しようとしましたが、成功しませんでした。コマンドラインで sgen.exe を使用すると、同じ結果が得られます...

何か不足していますか?アセンブリに署名すると機能しない理由がわかりません...

4

1 に答える 1

3

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

公開キーを取得する方法については、同様の質問に対するこの回答この MSDN の記事を参照してください。

于 2009-06-28T18:42:03.313 に答える