2011-01-23 2 views
0

Microsoft Windows의 Side-by-Side 어셈블리와 격리 된 응용 프로그램 솔루션을 살펴 보았습니다.1 개의 DLL에있는 사설 side-by-side 어셈블리 - 일반적인 DLL과 동일합니까?

문서는 말한다 :

개인 어셈블리 이 응용 프로그램과 함께 배포 및 해당 응용 프로그램의 독점 사용할 수 상태인지 어셈블리입니다.

개인 어셈블리는 다른 버전의 시스템 어셈블리의 와 작업에 나란히 설계되어야한다.

그러나 개인 어셈블리의 배포 프로세스는 응용 프로그램의 폴더 (또는 어셈블리 이름이있는 하위 폴더)에 assebly를 복사하는 것입니다. 따라서 응용 프로그램은 둘 이상의 개인 어셈블리 버전을 사용할 수 없습니다. 왜냐하면 다른 버전의 비공개 어셈블리를 넣으면 이전 버전을 덮어 쓸 것이기 때문입니다.

누군가가 설명해 주시겠습니까?

실제로 그렇다면 리디렉션이있는 일반적인 DLL보다 이러한 어셈블리의 장점은 무엇입니까? 그들은 나에게 꽤 똑같아 보이고 매니 페스트는 여기서도 사용되지 않는 것으로 보인다.

답변

3

dxs를 배포하기 위해 개인 SxS 어셈블리를 사용하는 것은 일을 더 자주 실패하게 만드는 단지 복잡한 방법입니다.

  • SXS 어셈블리가 단지 WinSxS에 폴더에, 더 안전하고, EXE의 폴더가 검색됩니다 :

    이 있지만 몇 가지 장점이 있습니다.

  • 등록 무료 COM에는 SxS 어셈블리가 필요합니다. 즉, COM 객체가 SxS 어셈블리로 번들로 묶인 응용 프로그램을 배포 할 수 있습니다.이 객체는 XCopy를 통해 설치되며 고도가 없습니다.
  • SxS 어셈블리는 개인 SxS 어셈블리로 설치 한 경우에도이 기술을 사용하여 동일한 DLL의 여러 버전을로드 할 수 있다는 것을 알게되면 더욱 강력 해집니다. 일반적인 이벤트 과정에서 Windows 로더가 EXE 파일을로드하고 활성화 컨텍스트를 만들기 위해 매니페스트를 처리하면 응용 프로그램 폴더를 SxS 검색의 기본 폴더로 사용합니다.

그러나, 당신은 개인 SXS 어셈블리에 대한 검색됩니다 사용자가 지정한 기본 폴더로 Activation Context API를 사용하여 런타임에 자신의 활성화 컨텍스트를 생성 할 수 있습니다. 이 기술을 사용하여 선택적 어셈블리 또는 다른 버전의 어셈블리를 동적으로로드하여 필요한 경우 일종의 플러그인 API를 구현할 수 있습니다.사람들은 항상 OS 로더에 의해 생성 된 상황에서로드로이 정적 바인딩 자원을 사용할 수 없음을 실현

  • :


    는 당신이 필요로하는 활성화 컨텍스트 API를 사용합니다. 자원 ID를> (16)

  • 와 RT_MANIFEST 리소스를 가진 ACTCTX 구조를 채우기로 외부 또는 내장 -

  • 당신이 응용 프로그램과 함께 제공되는 부하를 선택적으로 할 종속 어셈블리를 설명하는 일부 응용 프로그램 매니페스트 파일을 만들 매니페스트가있는 위치에 대한 세부 정보를 확인하고 lpAssemblyDirectory가 특정 버전의 개인 SxS 어셈블리를 보유한 디렉토리를 가리키는 지 확인합니다. CreateActCtx를 호출하여 활성화 컨텍스트 개체를 만듭니다.

  • dll의 특정 버전을로드 할 때 ActivateActCtx을 사용하여 적절한 활성화 컨텍스트를 활성화 한 다음 dll의 간단한 이름으로 LoadLibrary를 호출하십시오. 활성화 된 컨텍스트를 검색해야하는 API 함수를 다시 호출하지 않는 한 dll이로드되고 활성화 컨텍스트가 활성화 될 필요가 없으므로 호출 후 비활성화하십시오. &까지 DLL에 호스팅 된 클래스의 창을 만들거나 등록 무료 COM 개체를 만듭니다. DLL을로드하는 동안 - -

시스템 것이다 DLL AND가 가질 수있는 종속 어셈블리 제공된 lpAssemblyDirectory 검색.

+0

항목 3을 달성하는 방법을 설명 할 수 있습니까? 활성화 컨텍스트 API를 수동으로 사용하는 것이 유일한 방법입니까? 개인 어셈블리로 두 버전의 DLL을 저장할 방법이 없습니다. – Alex

+1

동일한 위치에 dll의 두 버전을 개인 어셈블리로 저장할 수 없습니다. 그러나 활성화 컨텍스트 API를 사용하면 어셈블리 검색 폴더를 제공 할 수 있습니다. –

1

음, 각 EXE에는 고유 한 개인 DLL이 있습니다. 여기에 덮어 쓰지 않고 각 EXE를 자체 설치 디렉토리에 넣습니다. 그들은 DLL의 다른 버전을 의도적으로 가질 수 있습니다. DLL Hell은 존재하지 않습니다. 그 외에도 DLL은 파일 시스템이나 레지스트리의 다른 부분을 터치하고이를 수행하는 단계가 될 수 있습니다. "반드시 나란히 설계되어야합니다"에 대한 언급. 이것은 달성하기가 거의 어렵지 않습니다.

+0

그래서 어셈블리가 일반적인 DLL과 어떻게 다릅니 까? DLL을 앱의 폴더에도 넣을 수 있습니다. 왜 내가 매니페스트가 필요한가요? – Alex

+0

당신이 무엇을 요구하고 있는지 확실하지 않습니다. DLL이 COM 서버 일 때 매니페스트가 필요합니다. Windows 및 CLR은 항상 EXE가 발생한 디렉터리를 조사하기 때문에 다른 DLL (네이티브 및 관리)은 간단히 발견됩니다. (끔찍한) side-by-side 문서는 'assembly'라는 용어를 일반적인 용어로 사용합니다. 실제로는 DLL을 의미합니다. –

+0

나는 이것에 대해 이야기하고있다. (http://msdn.microsoft.com/en-us/library/ff951638(VS.85).aspx) : "개인 어셈블리 **에는 반드시 어셈블리 매니페스트가 수반되어야한다." – Alex