2

내가 조금 특별한 뭔가를하려고 해요 ... 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를 사용할 때도 같은 결과가 나타납니다 ...

내가 뭔가를 잃어버린 물건이 있습니까? 어셈블리에 서명 할 때 왜 작동하지 않는지 이해할 수 없습니다 ...

답변

3

InternalsVisibleTo 특성에서 공용 키 토큰뿐만 아니라 전체 공용 키를 지정해야합니다.

공개 키를 얻는 방법은 this answer to a similar questionthis MSDN article을 참조하십시오.

+0

감사합니다. InternalsVisibleToAttribute에 대한 MSDN 설명서의 예가 잘못된 것입니다. 예제에 표시된 키가 매우 짧기 때문에 공개 키 토큰이라고 생각했습니다. –