강력한 이름 지정

강력한 이름 지정은 키를 사용해서 어셈블리에 서명하여 강력한 이름의 어셈블리를 생성하는 것을 말합니다. 어셈블리에 강력한 이름을 지정하면 이름 및 어셈블리 버전 번호를 기준으로 고유 ID가 생성되어 어셈블리 충돌을 방지하는 데 도움이 됩니다.

강력한 이름 지정의 단점은 어셈블리에 강력한 이름이 지정되고 나면 Windows의 .NET Framework에서 어셈블리를 엄격하게 로드한다는 것입니다. 강력한 이름의 어셈블리 참조는 로드된 어셈블리 버전과 정확히 일치해야 하므로 개발자는 어셈블리를 사용할 때 바인딩 리디렉션을 구성해야 합니다.

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

.NET 개발자가 강력한 이름 지정에 대해 불만을 제기하는 경우 일반적으로 엄격한 어셈블리 로드와 관련이 있습니다. 다행히, 이 문제는 .NET Framework에만 한정됩니다. .NET 5 이상, .NET Core, Xamarin, UWP, 대부분의 다른 .NET 구현에는 엄격한 어셈블리 로딩이 없으며 이는 강력한 이름 지정의 주요 단점입니다.

.NET Framework에서 강력한 이름 지정의 한 가지 중요한 측면은 바이럴이란 것입니다. 강력한 이름의 어셈블리는 다른 강력한 이름의 어셈블리만 참조할 수 있습니다. 라이브러리에 강력한 이름이 없으면 강력한 명명이 필요한 .NET Framework 앱 및 라이브러리에서 해당 라이브러리를 사용할 수 없습니다.

.NET Framework에서 강력한 명명의 이점은 다음과 같습니다.

  1. 다른 강력한 이름의 어셈블리에서 어셈블리를 참조하고 사용할 수 있습니다.
  2. GAC(전역 어셈블리 캐시)에 어셈블리를 저장할 수 있습니다.
  3. 다른 어셈블리 버전과 나란히 어셈블리를 로드할 수 있습니다. 병렬 어셈블리 로드는 일반적으로 플러그 인 아키텍처를 사용하는 애플리케이션에 필요합니다.

강력한 명명은 .NET Core/5+에서는 이점이 없습니다. C# 컴파일러는 강력하지 않은 이름의 어셈블리를 참조하는 강력한 이름의 어셈블리에 대해 CS8002 경고를 생성합니다. .NET Core/5+만을 대상으로 하는 라이브러리에 대해서는 이 경고를 표시하지 않아도 됩니다.

강력한 이름의 .NET 라이브러리 만들기

대상에 .NET Framework 또는 .NET Standard가 포함된 경우 오픈 소스 .NET 라이브러리에 강력한 이름을 지정해야 합니다. .NET Core/5+만을 대상으로 하는 라이브러리에는 강력한 명명이 필요하지 않습니다.

참고 항목

이 지침은 NuGet.org에 게시된 .NET 라이브러리와 같은 공개적으로 배포된 .NET 라이브러리에만 해당합니다. 대부분의 .NET 애플리케이션에는 강력한 이름 지정이 필요하지 않으므로 기본적으로 수행해서는 안 됩니다.

✔️ 라이브러리 어셈블리에 강력한 이름을 지정하는 것을 고려하세요.

✔️ 소스 제어 시스템에 강력한 이름 지정 키를 추가하는 것을 고려하세요.

공개적으로 사용 가능한 키를 통해 개발자는 라이브러리 소스 코드를 수정하고 동일한 키로 다시 컴파일할 수 있습니다.

부분 신뢰 시나리오에서 특별한 사용 권한을 제공하기 위해 이전에 사용된 경우에는 강력한 이름 지정 키를 공개해서는 안 됩니다. 공개하면 기존 환경이 손상될 수 있습니다.

Important

코드 게시자 ID를 원하는 경우 AuthenticodeNuGet 패키지 서명을 사용하는 것이 좋습니다. CAS(코드 액세스 보안)를 보안 완화로 사용해서는 안 됩니다.

✔️ 사용자가 바인딩 리디렉션 및 업데이트 빈도를 줄일 수 있도록 주 버전 변경 시에만 어셈블리 버전을 높이는 것을 고려하세요.

버전 관리 및 어셈블리 버전을 참조하세요.

❌ 강력한 이름 지정 키를 추가, 제거 또는 변경하지 마세요.

어셈블리의 강력한 이름 지정 키를 수정하면 어셈블리 ID가 변경되고, 어셈블리 ID를 사용하는 컴파일된 코드가 중단됩니다. 자세한 내용은 호환성이 손상되는 이진 변경을 참조하세요.

❌ 강력한 이름 및 강력하지 않은 이름이 지정된 버전의 라이브러리를 게시하지 마세요. 예를 들어 Contoso.ApiContoso.Api.StrongNamed를 지정합니다.

두 패키지를 게시하면 개발자 에코시스템이 포크됩니다. 또한 애플리케이션이 두 패키지에 모두 종속하게 되면 개발자가 형식 이름 충돌을 발견할 수 있습니다. 적어도 .NET의 경우 어셈블리마다 형식이 다릅니다.