2009-11-16 4 views
6

Silverlight 어셈블리는 "일반".NET 어셈블리와 이진 호환되지 않습니다. 동일한 컴파일러가 두 유형의 어셈블리를 만드는 데 사용된다는 사실을 고려하면 어떻게 될 수 있습니까? (mscorlib.dll이 Silverlight 용으로 참조되지 않더라도)?Silverlight 어셈블리가 "일반".NET 어셈블리와 이진 호환되지 않는 이유

+2

'바이너리 호환'이란 무엇입니까? –

+0

"Not binary compatible"구문은 일반적으로 Silverlight 어셈블리에서 "일반"어셈블리를 참조 할 수 없다는 사실을 설명하는 데 사용되며 그 반대의 경우도 마찬가지입니다. – Konstantin

답변

9

맞아, 좋은 질문입니다. 이 영역에는 많은 오해가 있으며 사실과 허구를 구분하는 것이 중요합니다.

픽션 : Silverlight 어셈블리는 magic microsoft gnomes로 컴파일되며 .Net 데스크톱 CLR에서는 호환되지 않습니다.

사실 : CLR에는 "Fusion"이라는 아름답게 연결된 시스템이 있습니다.
각 어셈블리에는 DLL/EXE의 일부로 포함 된 어셈블리 매니페스트가 있습니다.
어셈블리 매니페스트에는 많은 수의 임베디드 리소스, 유형 시스템 정보 등이 들어 있으며이 어셈블리에는 다른 어셈블리가 필요합니다.

Fusion은 어셈블리 매니페스트 종속성을 확인하고 해당하는 실제 파일을 찾는 역할을하는 CLR의 일부입니다.

데스크톱에서 Silverlight 어셈블리 용 Fusion .Net CLR - 작동합니다. (모든 종속성이 있다고 가정)

데스크톱 어셈블리 용 Silverlight CLR에서의 퓨전 - 작동하지 않습니다.
주로 .Net BCL (Base Class Library) DLL이 존재하지 않기 때문입니다. 언급했듯이 다른 mscorlib.dll, agcorlib.dll, System.dll, System.Windows.dll 등입니다.
이러한 DLL이 서로 다른 이유는 주로 보안입니다. 정상적인 BCL은 포인터, 플랫폼 특정 p/호출, 파일, 레지스트리 등으로 모든 종류의 불쾌한 것을 만들어냅니다. 브라우저 만 실행하면됩니다.

그래서, 합산 :
실버 조립품에은 ->

을 작동하지 않습니다 실버 CLR ==에 실행하면 당신이 원하는 경우 -> 바탕 화면 CLR ==에들이받은은
데스크톱 어셈블리를 작동 데스크탑 CLR에서 실행되는 Silverlight 어셈블리의 실제 예입니다. 1 년 전의 기사를 확인하십시오. @SILVERLIGHT DLLS ON THE DESKTOP CLR

+0

엔젤과 완전히 동의하지만 두 플랫폼 모두에서 작동하는 재사용 가능한 코드를 코딩 할 수있는 창조적 인 방법이 있습니다. –

+0

@Boris : 예. 올바른 방법은 VS에서 링크 된 소스 파일을 사용하는 것입니다. 따라서 동일한 소스 코드에서 두 개의 어셈블리를 생성합니다. – AnthonyWJones

+0

@ Justin : "그래, 그럼, 좋은 질문", 당신에게서 upvote을 위해 충분히 좋지 않니? ;) – AnthonyWJones

0

일리노이 코드는 동일합니다. 그러나 핵심 라이브러리가 다르므로 라이브러리가 Silverlight에없는 외부 라이브러리를 참조하므로 Silverlight에서 .NET 용으로 컴파일 된 라이브러리에서 가장 간단한 작업조차도 작동하지 않습니다.

+0

이것은 예를 들어 Silverlight System.Object에서 다를 수 있으며 .NET 유형이 Silverlight에서 참조되는 경우 예측할 수없는 동작을 의미 할 수 있습니다. 그러나 Silverlight 어셈블리에서 .NET 어셈블리를 참조 할 수 없다는 제한은 IDE에 넣고 csc를 호출합니다.명령 줄에서 exe는 여전히이 경우 컴파일됩니까? – Konstantin

+0

아마 올바른 방법은 아마도 모든 .NET 어셈블리가 mscorlib.dll을 참조한다는 것입니다 (적어도 모든 유형은 System.Object에서 상속되기 때문에). 그러나 Silverlight에서는 mscorlib.dll을 사용할 수 없습니다. 내가 맞습니까? – Konstantin

+0

SL에서 사용하는 mscorlib의 버전은 전체 .NET에서 사용되는 버전과 다릅니다. 참조 제한이 실제로 IDE에 의해 부과 된 것이 맞습니다. – AnthonyWJones

0

Silverlight는 mscorlib.dll의 경량 버전을 사용하기 때문에 호환되지 않습니다. 그러나 Silverlight에서 "일반".NET 용 코드를 재사용 할 수 있습니다.

+0

Microsoft에서 mscorlib.dll hugh의 경량 버전을 사용하도록 설정하지 않은 경우 어떻게해야합니까? 무슨 일이 일어 났을까요? – abmv

+0

Silverlight에서 "일반"라이브러리 집합을 사용하는 경우 Silverlight 기반 웹 사이트를 사용하려면 전체 묶음 .NET Framework를 설치해야합니다. –

관련 문제