2010-11-22 8 views
4

동일한 C# .NET 프로젝트의 여러 버전을 배포해야합니다. 프로젝트 출력은 기본 응용 프로그램에서 사용할 COM interop 어셈블리입니다. 내가 가지고있는 문제는이 어셈블리의 여러 버전을 나란히 배치해야한다는 것입니다.하지만 내가하는 일은 다른 버전을 만들지 않는 것입니다. 대신 버전이 서로 우선합니다.COM interop side-by-side 어셈블리

어셈블리 GUID를 변경하고 어셈블리 버전 번호를 변경해 보았습니다. 어셈블리의 강력한 이름 키를 다시 생성하려고 시도했지만 어셈블리 제목과 설명을 변경하려고 시도했습니다. 차라리 버전 관리 목적으로 어셈블리의 개별 유형에 대한 GUID 또는 이름을 변경하지 않아도됩니다.

이 버전이 서로를 덮어 쓰지 않도록하고 어떻게 나란히 보이게 할 수 있습니까?

미리 감사드립니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace InteropTest 
{ 
    [Guid("...")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class Test 
    { 
     public Test() 
     { 
     } 

     public string Version 
     { 
      get 
      { 
       return "1.0"; 
      } 
     } 
    } 
} 

답변

5

버전 관리를 위해 어셈블리의 개별 유형에 대한 GUID 또는 이름을 변경하지 않아도됩니다.

그러나 정확히 당신이 서로 간섭 COM 유형을 방지하기 위해해야 ​​할 일. [Guid]는 COM 클래스가 등록 된 HKLM \ Software \ Classes \ CLSID에서 레지스트리 키를 선택하는 데 사용됩니다. 동일한 Guid를 가진 두 개의 서로 다른 버전이 서로 다른 키를 덮어 씁니다. 그렇지 않으면 DLL 지옥으로 알려져 있습니다. 공용 인터페이스를 변경하면 은 새 가이드를으로 지정하여 이전 클라이언트를 사용하는 클라이언트가 오작동을 진단하는 것이 불가능 해 죽지 않도록합니다. 견고한 COM 요구 사항.

[Guid] 속성을 생략하는 것은 매우 가능합니다. 이제 CLR에 그대로 두어 생성 할 수 있습니다. 이제 어셈블리 속성이 역할을하기 시작합니다. guid 값은 어셈블리 이름과 버전, 인터페이스의 메소드 세트 및 해당 인수를 포함하는 매끄러운 알고리즘에 의해 자동 생성됩니다. 따라서 이 자동으로 변경되면 다른 GUID가 생성됩니다. 그리고 예상대로 필요에 따라 다른 [AssemblyVersion]이 다른 [Guid]를 생성합니다.

또 하나의 접근법은 'side-by-side'를 의미한다고 가정했지만 이 아니라은 어셈블리를 등록하지만 대신 매니페스트를 사용합니다. 클라이언트 프로그램에 임베디드되어야하며 <clrClass> 요소를 사용하여 [ComVisible] 클래스를 선언하십시오. 이제 버전 관리가 배포 세부 사항이됩니다. MSDN how-to is here. [ComVisible] 어셈블리가 아닌 클라이언트 프로그램에 포함되어야 함을 명심하십시오. 그것은 문제가되는 경향이 있습니다.

+0

Hans를 보내 주셔서 감사합니다. 이제는 당 유형별 새 GUID 경로를 따를 것입니다. –

2

가능하면 네이티브 응용 프로그램의 interop 어셈블리에 후기 바인딩을 시도하십시오. 또한 AutoDual을 사용하여 자동으로 인터페이스를 생성하는 대신에 자신의 명시 적으로 생성하는 인터페이스에 대한 자세한 정보는 this을 참조하십시오. regedit을 열고 Guid 및 ProgId를 검색하여 등록 된 어셈블리 버전을 확인하여 문제를 해결할 수 있습니다.

관련 문제