병렬 어셈블리에 대한 DLL 작성

사용자 고유의 병렬 어셈블리를 만들 때 다음 지침에 따라 병렬 어셈블리를 만들기 위한 지침을 따르고 어셈블리 에 사용되는 모든 DLL을 작성합니다.

  • 여러 버전이 서로 간섭하지 않고 동시에 동일한 프로세스에서 실행될 수 있도록 DLL을 설계해야 합니다. 예를 들어 많은 애플리케이션은 각각 다른 버전의 구성 요소가 필요한 여러 플러그 인을 호스트합니다. 병렬 어셈블리의 개발자는 동일한 프로세스에서 동시에 실행할 때 여러 버전의 구성 요소가 올바르게 작동하는지 확인하기 위해 설계 및 테스트해야 합니다.

  • Windows XP 이전 시스템에서 구성 요소를 공유 구성 요소로 제공하려는 경우 이러한 시스템에 단일 instance 공유 구성 요소로 구성 요소를 계속 설치해야 합니다. 이 경우 구성 요소가 이전 버전과 호환되는지 확인해야 합니다.

  • 시스템에서 둘 이상의 어셈블리 버전이 실행되는 경우 개체의 사용을 평가합니다. 다른 버전의 어셈블리에 메모리 매핑된 파일, 명명된 파이프, 등록된 Windows 메시지 및 클래스, 공유 메모리, 세마포, 뮤텍스 및 하드웨어 드라이버와 같은 별도의 데이터 구조가 필요한지 여부를 결정합니다. 어셈블리 버전에서 사용되는 모든 데이터 구조는 이전 버전과 호환되어야 합니다. 버전 간에 사용할 수 있는 데이터 구조와 버전에 대해 비공개여야 하는 데이터 구조를 결정합니다. 공유 데이터 구조에 세마포 및 뮤텍스와 같은 별도의 동기화 개체가 필요한지 여부를 확인합니다.

  • 창 클래스 및 Atoms와 같은 일부 개체는 각 프로세스에 대해 고유하게 이름이 지정됩니다. 매니페스트를 사용하여 각 어셈블리에 대해 창 클래스와 같은 개체의 버전을 지정해야 합니다. Atoms와 같은 개체의 경우 버전 간에 공유하려는 경우가 아니면 버전별 식별자를 사용합니다. 버전별 식별자를 사용하는 경우 네 부분으로 구성된 버전 관리 번호를 사용합니다.

  • DLL에 자체 등록 코드를 포함하지 않습니다. 병렬 어셈블리의 DLL은 자체 등록할 수 없습니다.

  • #define 문을 사용하여 DLL의 모든 버전별 이름을 정의합니다. 이렇게 하면 모든 레지스트리 키를 한 위치에서 변경할 수 있습니다. 새 버전의 어셈블리를 릴리스하는 경우 이 #define 문만 변경하면 됩니다. 예:

    #define MyRegistryKey "MyAssembly1.0.0.0"

  • 존재하지 않는 데이터를 Temp 디렉터리에 저장합니다.

  • 사용자 데이터를 전역 위치에 배치하지 마세요. 애플리케이션 데이터를 사용자 데이터와 별도로 유지합니다.

  • 모든 공유 파일에 애플리케이션의 이름에 따라 달라지는 파일 버전을 할당합니다.

  • 의도하지 않은 프로세스 간 공유를 방지하기 위해 프로세스 간에 사용되는 모든 메시지 및 데이터 구조를 버전에 할당합니다.

  • DLL은 다른 버전의 어셈블리에서 공유되지 않는 공유 메모리 섹션과 같이 존재하지 않을 수 있는 버전 간에 공유에 의존해서는 안 됩니다.

  • 원래 DLL의 이진 인터페이스 호환성 계약을 따르지 않는 새 기능을 추가하는 경우 새 CLSID, ProgId 및 파일 이름을 할당해야 합니다. 그런 다음 이 CLSID, ProgId 및 파일 이름을 사용하려면 이후 버전의 side-by-side 어셈블리가 필요합니다. 이렇게 하면 나란히 표시되지 않는 DLL 버전이 side-by-side 버전에 등록될 때 충돌이 방지됩니다.

  • 동일한 CLSID 또는 ProgId를 다시 사용하는 경우 어셈블리가 이전 버전과 호환되는지 테스트합니다.

  • 어셈블리 코드에서 어셈블리의 기본 설정을 초기화하고 설정합니다. 레지스트리에 기본 설정을 저장하지 마세요.

  • 모든 데이터 구조에 버전을 할당합니다.

  • DLL은 Side-by-Side 어셈블리에 대한 상태 스토리지 작성에 설명된 대로 병렬 어셈블리의 상태를 저장해야 합니다.