ちょっと変わったことをしようと...
私はこのクラス 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 を使用すると、同じ結果が得られます...
何か不足していますか?アセンブリに署名すると機能しない理由がわかりません...