2012-07-10 2 views
12

대상 지정 가능한 어셈블리 참조는 .NET Compact Framework 용으로 도입되었으며 이제는 휴대용 클래스 라이브러리를 지원하는 데 사용됩니다.C# 컴파일러는 어떻게 재 타겟팅 가능한 어셈블리 참조를 방출하기로 결정합니까?

기본적으로, 컴파일러는 다음 MSIL은 방출 :

.assembly extern retargetable mscorlib 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       
    .ver 2:0:5:0 
} 

어떻게 C# 컴파일러는이 타겟을 바꿀 수있는 기준을 방출하는 이해, 심지어 휴대용 외부 등 참조를 방출하는 C# 컴파일러를 강제하는 방법을 수행 클래스 라이브러리?

+0

MSBuild 대상 파일에 대한 힌트가 없습니까? 커맨드 라인에서 컴파일러에 전달해야 할 것이 무엇인지 궁금합니다. – leppie

답변

2

어셈블리 자체의 경우 어셈블리 플래그, 즉 [assembly : AssemblyFlags (AssemblyNameFlags.Retargetable)]입니다.

이 플래그는 플랫폼 어셈블리 외부에서는 의미가 없으므로주의하십시오. 사용자 지정 어셈블리는 대상을 재 지정할 수 없습니다.

참조 용으로 참조 할 어셈블리의 이름의 일부로 복사됩니다.

+0

감사합니다. 이것이 제가 찾고 있던 것입니다. Post.carp, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 53d2effcf2ee70dc, Retargetable = Yes '또는 그 종속성 중 하나의 메시지를 없애기를 원했습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.(Exception from HRESULT : 0x80131040)'(IHostAssemblyStore를 통해) CLR이 요청한 것보다 다른 어셈블리를 제공 할 때 대상을 다시 지정할 수있는 참조에서도 오류가 발생합니다. 이 문제를 해결할 수있는 방법이 있습니까? –

+0

Retargable은 시도하고 있다고 가정하고있는 것처럼 사용자 어셈블리를 키 점프 할 수 없습니다. 이는 CLR 내부 용도로만 사용됩니다. 나는 호스팅 API에 대한 전문가는 아니지만, LoadFile이 그렇게 할 수 있다고 생각합니다. –

+0

감사. 나는 다른 짧은 해결책을 시도 할 것이다 : 동일한 짧은 이름, 동일한 강한 이름 열쇠, 그러나 다른 버전 번호. 일반 바인딩 정책은 트릭을 수행해야합니다. –

2

도움이 될지 확실하지 않지만 다음 파일이 자동 생성되어 빌드에 포함되었습니다.

using System; 
using System.Reflection; 
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(
    ".NETPortable,Version=v4.0,Profile=Profile4", 
    FrameworkDisplayName = ".NET Portable Subset")] 

이것은 약간의 마술을하는 컴파일러에게 힌트를 줄 수 있습니다.

편집 :

위의 라이브러리는 휴대용이라고 생각합니다. 명령 줄에서 /nostdlib+이 사용되고 휴대용 mscorlib.dll이 참조됩니다 (위에서 언급 한 속성과 동일한 것으로 가정 함).

"... \ Profile4 \의가 mscorlib.dll \ 프로그램 파일 \ 참조 어셈블리 \ 마이크로 소프트 \ Framework.NETPortable \ 4.0의 \ 프로필"

+1

'TargetFrameworkAttribute'는 Client와 Full Framework for v4에 대해서도 존재 합니다만, v3.5에서는 그렇지 않습니다. 이것은 그들이 속성을 추가 한 이유 일 수 있습니다. v4부터는 어셈블리가 전체 프레임 워크 또는 클라이언트 프로파일 용으로 빌드되었는지 확인할 수있는 매우 쉬운 방법을 제공합니다. –

+0

@AdamHouldsworth : 감사합니다. 4.5 버전에서 클라이언트 프로필이 사라지면 이제는 쓸모가 없습니다. ; p – leppie

+0

.NET 4에서도 클라이언트 프로필과 전체 다운로드의 차이는 MB LOL의 가치가 아니 었습니다. 아마도 PCL을 선호하는 이유 였을 것입니다. –

0

나는 C# 컴파일러가 할 것이라고 실험에 의해 발견했습니다 참조 된 어셈블리가 타겟으로 지정할 수있는 경우 대상 컴파일러로 참조 컴파일러 (MSIL의 .assembly 섹션의 수정 자). 나는 컴파일러가 어셈블리를 재 타겟팅 할 수 있도록 결정하는 방법을 찾지 못했습니다.

관련 문제