내가 조금 특별한 뭔가를하려고 해요 ... SGEN, InternalsVisibleTo 및 조립 서명
내가이 클래스 푸이 이름에 대한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 속성은 올바르게 serialize 및 deserialize됩니다.
지금, 내 어셈블리에 서명 할 ... 그래서 난 내 어셈블리 키 파일을 정의하고, 내가 키와 일치하도록 InternalsVisibleTo 선언을 수정
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]
을하지만 지금 SGEN 실패 :
임시 클래스 (결과 = 1)를 생성 할 수 없습니다. 단지
SGEN 작업이 매크로를 통해 키 파일을 선택해야 읽기,하지만 분명히 그 또한 ... 충분하지 않습니다 -
건물 또는 인덱서 'TestXML2008.Foo.Name는'할당 할 수 없습니다 성공하지 않고 SGEN 작업에서 키 파일을 명시 적으로 지정하려고했습니다. 명령 줄에서 sgen.exe를 사용할 때도 같은 결과가 나타납니다 ...
내가 뭔가를 잃어버린 물건이 있습니까? 어셈블리에 서명 할 때 왜 작동하지 않는지 이해할 수 없습니다 ...
감사합니다. InternalsVisibleToAttribute에 대한 MSDN 설명서의 예가 잘못된 것입니다. 예제에 표시된 키가 매우 짧기 때문에 공개 키 토큰이라고 생각했습니다. –