소프트웨어 개발 키트 만들기

SDK(소프트웨어 개발 키트)는 Visual Studio에서 단일 항목으로 참조할 수 있는 API 컬렉션입니다. 참조 관리자 대화 상자에는 프로젝트에 관련된 모든 SDK가 나열됩니다. 프로젝트에 SDK를 추가하면 Visual Studio에서 API를 사용할 수 있습니다.

SDK에는 다음과 같이 두 가지 유형이 있습니다.

  • 플랫폼 SDK는 플랫폼용 앱을 개발하기 위한 필수 구성 요소입니다. 예를 들어 Windows 8.x 스토어 앱을 개발하려면 Windows 8.1 SDK가 필요합니다.

  • 확장 SDK는 플랫폼을 확장하는 선택적 구성 요소이지만 해당 플랫폼용 앱을 개발하는 데 필수인 것은 아닙니다.

다음 섹션에서는 SDK의 일반 인프라와 플랫폼 SDK 및 확장 SDK를 만드는 방법을 설명합니다.

플랫폼 SDK

플랫폼용 앱을 개발하기 위해서는 플랫폼 SDK가 필요합니다. 예를 들어 Windows 8.1용 앱을 개발하려면 Windows 8.1 SDK가 필요합니다.

설치

모든 플랫폼 SDK는 HKLM\Software\Microsoft\Microsoft SDKs\[TPI]\v[TPV]\@InstallationFolder = [SDK root]에 설치됩니다. 따라서 Windows 8.1 SDK는 HKLM\Software\Microsoft\Microsoft SDKs\Windows\v8.1에 설치됩니다.

Layout

플랫폼 SDK에는 다음과 같은 레이아웃이 있습니다.

\[InstallationFolder root]
            SDKManifest.xml
            \References
                  \[config]
                        \[arch]
            \DesignTime
                  \[config]
                        \[arch]
노드 설명
References 폴더 코딩할 수 있는 API를 포함하는 이진 파일을 포함합니다. 여기에는 WinMD(Windows 메타데이터) 파일 또는 어셈블리가 포함될 수 있습니다.
DesignTime 폴더 사전 실행/디버깅 시간에만 필요한 파일을 포함합니다. 여기에는 XML 문서, 라이브러리, 헤더, 도구 상자 디자인 타임 이진 파일, MSBuild 아티팩트 등이 포함될 수 있습니다.

XML 문서는 이상적으로 \DesignTime 폴더에 배치되지만 참조용 XML 문서는 Visual Studio의 참조 파일 옆에 계속 배치됩니다. 예를 들어 reference\References\[config]\[arch]\sample.dll의 XML 문서는 \References\[config]\[arch]\sample.xml이고 해당 문서의 지역화된 버전은 \References\[config]\[arch]\[locale]\sample.xml이 됩니다.
Configuration 폴더 Debug, Retail, CommonConfiguration과 같은 세 개의 폴더만 있을 수 있습니다. SDK 작성자는 SDK 소비자가 대상으로 하는 구성에 관계없이 동일한 SDK 파일 집합을 사용해야 하는 경우 CommonConfiguration 아래에 해당 파일을 배치할 수 있습니다.
Architecture 폴더 지원되는 모든 architecture 폴더가 있을 수 있습니다. Visual Studio는 x86, x64, ARM, 중립 아키텍처를 지원합니다. 참고: Win32는 x86에 매핑되고 AnyCPU는 중립에 매핑됩니다.

MSBuild는 플랫폼 SDK의 \CommonConfiguration\neutral에서만 표시됩니다.
SDKManifest.xml 이 파일은 Visual Studio에서 SDK를 사용하는 방법을 설명합니다. Windows 8.1의 SDK 매니페스트를 확인합니다.

<FileList DisplayName = "Windows" PlatformIdentity = "Windows, version=8.1" TargetFramework = ".NET for Windows Store apps, version=v4.5.1; .NET Framework, version=v4.5.1" MinVSVersion = "14.0"> <File Reference = "Windows.winmd"> <ToolboxItems VSCategory = "Toolbox.Default" /> </File> </FileList>

Displayname: 찾아보기 목록에 개체 브라우저가 표시하는 값입니다.

PlatformIdentity: 이 특성이 있으면 Visual Studio 및 MSBuild에서 SDK가 플랫폼 SDK이며 SDK에서 추가된 참조가 로컬로 복사되어서는 안 된다는 것을 알 수 있습니다.

TargetFramework: 이 특성은 Visual Studio에서 이 특성 값에 지정된 것과 동일한 프레임워크를 대상으로 하는 프로젝트만 SDK를 사용할 수 있도록 하기 위해 사용됩니다.

MinVSVersion: 이 특성은 Visual Studio에서 해당 특성에 적용되는 SDK만 사용하는 데 사용됩니다.

참조: 이 특성은 컨트롤을 포함하는 참조에 대해서만 지정해야 합니다. 참조에 컨트롤이 포함되어 있는지 여부를 지정하는 방법에 대한 자세한 내용은 아래를 참조하세요.

확장 SDK

다음 섹션에서는 확장 SDK를 배포하기 위해 수행해야 하는 작업을 설명합니다.

설치

확장 SDK는 레지스트리 키를 지정하지 않고 특정 사용자 또는 모든 사용자를 위해 설치될 수 있습니다. 모든 사용자에게 SDK를 설치하려면 다음 경로를 사용합니다.

%Program Files%\Microsoft SDKs<target platform>\v<platform version number>\ExtensionSDKs

사용자별 설치의 경우 다음 경로를 사용합니다.

%USERPROFILE%\AppData\Local\Microsoft SDKs<target platform>\v<platform version number>\ExtensionSDKs

다른 위치를 사용하려면 다음 두 가지 중 하나를 수행해야 합니다.

  1. 레지스트리 키에 지정합니다.

    HKLM\Software\Microsoft\Microsoft SDKs<target platform>\v<platform version number>\ExtensionSDKs<SDKName><SDKVersion>\

    <path to SDK><SDKName><SDKVersion>의 값을 가진 (기본값) 하위 키를 추가합니다.

  2. 프로젝트 파일에 MSBuild 속성 SDKReferenceDirectoryRoot를 추가합니다. 이 속성의 값은 참조하려는 확장 SDK가 상주하는 디렉터리의 세미콜론으로 구분된 목록입니다.

설치 레이아웃

확장 SDK에는 다음과 같은 설치 레이아웃이 있습니다.

\<ExtensionSDKs root>
           \<SDKName>
                 \<SDKVersion>
                        SDKManifest.xml
                        \References
                              \<config>
                                    \<arch>
                        \Redist
                              \<config>
                                    \<arch>
                        \DesignTime
                               \<config>
                                     \<arch>

  1. \<SDKName>\<SDKVersion>: 확장 SDK의 이름과 버전은 SDK 루트 경로의 해당 폴더 이름에서 파생됩니다. MSBuild는 이 ID를 사용하여 디스크에서 SDK를 찾고, Visual Studio는 이 ID를 속성 창 및 참조 관리자 대화 상자에 표시합니다.

  2. References 폴더: API를 포함하는 이진 파일입니다. WinMD(Windows 메타데이터) 파일 또는 어셈블리일 수 있습니다.

  3. Redist 폴더: 런타임/디버깅에 필요한 파일이며 사용자 애플리케이션의 일부로 패키지되어야 합니다. 모든 이진 파일은 \redist\config<\><arch> 아래에 배치해야 하며 이진 이름은 고유성을 보장하기 위해 다음과 같은 형식을 가져야 합니다. ]<company>.<product>.<purpose>.<extension>. 예를 들면 *Microsoft.Cpp.Build.dll입니다. XAML 컨트롤과 연결된 파일을 제외하고 다른 SDK의 파일 이름과 충돌할 수 있는 이름을 가진 모든 파일(예: javascript, css, pri, xaml, png, jpg 파일)은 \redist\<config>\arch<\><sdkname>* 아래에 배치해야 합니다. 이러한 파일은 *\redist\<config>\<arch>\<componentname>\ 아래에 배치해야 합니다.

  4. DesignTime 폴더: 사전 실행/디버깅 시간에만 필요하고 사용자 애플리케이션의 일부로 패키지해서는 안 되는 파일입니다. 여기에는 XML 문서, 라이브러리, 헤더, 도구 상자 디자인 타임 이진 파일, MSBuild 아티팩트 등이 포함될 수 있습니다. 네이티브 프로젝트에서 사용하도록 설계된 모든 SDK에는 SDKName.props 파일이 있어야 합니다. 다음은 이러한 형식의 파일 샘플을 보여 줍니다.

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <ExecutablePath>C:\Temp\ExecutablePath;$(ExecutablePath)</ExecutablePath>
        <IncludePath>$(FrameworkSDKRoot)\..\v8.1\ExtensionSDKs\cppimagingsdk\1.0\DesignTime\CommonConfiguration\Neutral\include;$(IncludePath)</IncludePath>
        <AssemblyReferencePath>C:\Temp\AssemblyReferencePath;(AssemblyReferencePath)</AssemblyReferencePath>
        <LibraryPath>$(FrameworkSDKRoot)\..\v8.1\ExtensionSDKs\cppimagingsdk\1.0\DesignTime\Debug\ARM;$(LibraryPath)</LibraryPath>
        <SourcePath>C:\Temp\SourcePath\X64;$(SourcePath)</SourcePath>
        <ExcludePath>C:\Temp\ExcludePath\X64;$(ExcludePath)</ExcludePath>
        <_PropertySheetDisplayName>DevILSDK, 1.0</_PropertySheetDisplayName>
      </PropertyGroup>
    </Project>
    
    

    XML 참조 문서는 참조 파일과 함께 배치됩니다. 예를 들어 \References\<config>\<arch>\sample.dll의 XML 참조 문서는 \References\<config>\<arch>\sample.xml이고 해당 문서의 지역화된 버전은 \References\<config>\<arch>\<locale>\sample.xml이 됩니다.

  5. Configuration 폴더: Debug, Retail, CommonConfiguration의 세 가지 하위 폴더입니다. SDK 작성자는 SDK 소비자가 대상으로 하는 구성에 관계없이 동일한 SDK 파일 집합을 사용해야 하는 경우 CommonConfiguration 아래에 파일을 배치할 수 있습니다.

  6. Architecture 폴더: x86, x64, ARM, 중립 아키텍처가 지원됩니다. Win32는 x86에 매핑되고 AnyCPU는 중립에 매핑됩니다.

SDKManifest.xml

SDKManifest.xml 파일은 Visual Studio에서 SDK를 사용하는 방법을 설명합니다. 다음은 이에 대한 예입니다.

<FileList DisplayName = "My SDK"
          ProductFamilyName = "My SDKs"
          TargetFramework = ".NETCore, version=v4.5.1; .NETFramework, version=v4.5.1"
          MinVSVersion = "14.0"
          MaxPlatformVersion = "8.1"
          AppliesTo = "WindowsAppContainer + WindowsXAML"
          SupportPrefer32Bit = "True"
          SupportedArchitectures = "x86;x64;ARM"
          SupportsMultipleVersions = "Error"
          CopyRedistToSubDirectory = "."
          DependsOn = "SDKB, version=2.0"
          MoreInfo = "https://msdn.microsoft.com/MySDK">
  <File Reference = "MySDK.Sprint.winmd" Implementation = "XNASprintImpl.dll">
    <Registration Type = "Flipper" Implementation = "XNASprintFlipperImpl.dll" />
    <Registration Type = "Flexer" Implementation = "XNASprintFlexerImpl.dll" />
    <ToolboxItems VSCategory = "Toolbox.Default" />
  </File>
</FileList>

다음 목록은 파일의 요소를 제공합니다.

  1. DisplayName: Visual Studio의 사용자 인터페이스에서 참조 관리자, 솔루션 탐색기, 개체 브라우저, 다른 위치에 표시되는 값입니다.

  2. ProductFamilyName: 전체 SDK 제품 이름입니다. 예를 들어 WinJS(JavaScript용 Windows 라이브러리) SDK의 이름은 “Microsoft.WinJS.1.0” 및 “Microsoft.WinJS.2.0”으로 지정되며 동일한 SDK 제품군인 “Microsoft.WinJS”에 속합니다. 이 특성을 사용하면 Visual Studio 및 MSBuild에서 해당 연결을 만들 수 있습니다. 이 특성이 없으면 SDK 이름이 제품 패밀리 이름으로 사용됩니다.

  3. FrameworkIdentity: 하나 이상의 Windows 구성 요소 라이브러리에 대한 종속성을 지정합니다. 이 특성의 값은 사용 중인 앱의 매니페스트에 저장됩니다. 이 특성은 Windows 구성 요소 라이브러리에만 적용됩니다.

  4. TargetFramework: 참조 관리자 및 도구 상자에서 사용할 수 있는 SDK를 지정합니다. 세미콜론으로 구분된 대상 프레임워크 모니커 목록입니다(예: “.NET Framework, version=v2.0; .NET Framework, version=v4.5.1”). 동일한 대상 프레임워크의 여러 버전이 지정된 경우 참조 관리자는 필터링 목적으로 가장 낮게 지정된 버전을 사용합니다. 예를 들어 “.NET Framework, version=v2.0; .NET Framework version=v4.5.1”이 지정되면 참조 관리자는 “.NET Framework, version=v2.0”을 사용합니다. 특정 대상 프레임워크 프로필이 지정된 경우 해당 프로필만 필터링을 위해 참조 관리자에서 사용됩니다. 예를 들어 “Silverlight, version=v4.0, profile=WindowsPhone”을 지정하면 참조 관리자는 Windows Phone 프로필에서만 필터링합니다. 전체 Silverlight 4.0 Framework를 대상으로 하는 프로젝트에서는 참조 관리자에 SDK가 표시되지 않습니다.

  5. MinVSVersion: 최소 Visual Studio 버전입니다.

  6. MaxPlatformVerson: 최대 대상 플랫폼 버전을 사용하여 확장 SDK가 작동하지 않는 플랫폼 버전을 지정해야 합니다. 예를 들어 Microsoft Visual C++ 런타임 패키지 v11.0은 Windows 8 프로젝트에서만 참조되어야 합니다. 따라서 Windows 8 프로젝트의 MaxPlatformVersion은 8.0입니다. 즉, 참조 관리자는 Windows 8.1 프로젝트의 Microsoft Visual C++ 런타임 패키지를 필터링하고 Windows 8.1 프로젝트에서 참조할 때 MSBuild가 오류를 throw합니다. 참고: 이 요소는 Visual Studio 2013부터 지원됩니다.

  7. AppliesTo: 적용 가능한 Visual Studio 프로젝트 형식을 지정하여 참조 관리자에서 사용할 수 있는 SDK를 지정합니다. WindowsAppContainer, VisualC, VB, CSharp, WindowsXAML, JavaScript, Managed, Native의 9가지 값이 인식됩니다. SDK 작성자는 (“!”) 연산자가 아닌 (“+”) 또는 (“|”)를 사용하여 SDK에 적용되는 프로젝트 형식의 범위를 정확하게 지정할 수 있습니다.

    WindowsAppContainer는 Windows 8.x 스토어 앱의 프로젝트를 식별합니다.

  8. SupportPrefer32Bit: 지원되는 값은 “True” 및 “False”입니다. 기본값은 “True”입니다. 값이 “False”로 설정된 경우 SDK를 참조하는 프로젝트에 Prefer32Bit를 사용하도록 설정한 경우 MSBuild는 Windows 8.x 스토어 프로젝트의 오류(또는 데스크톱 프로젝트의 경고)를 반환합니다. Prefer32Bit에 대한 자세한 내용은 빌드 페이지, 프로젝트 디자이너(C#) 또는 컴파일 페이지, 프로젝트 디자이너(Visual Basic)를 참조하세요.

  9. SupportedArchitectures: SDK에서 지원하는 세미콜론으로 구분된 아키텍처의 목록입니다. MSBuild는 사용 중인 프로젝트의 대상 SDK 아키텍처가 지원되지 않는 경우에 경고를 표시합니다. 이 특성을 지정하지 않으면 MSBuild에서 이러한 유형의 경고를 표시하지 않습니다.

  10. SupportsMultipleVersions: 이 특성이 오류 또는 경고로 설정된 경우 MSBuild는 동일한 프로젝트가 동일한 SDK 제품군의 여러 버전을 참조할 수 없음을 나타냅니다. 이 특성이 없거나 허용으로 설정된 경우 MSBuild는 이러한 유형의 오류 또는 경고를 표시하지 않습니다.

  11. AppX: 디스크의 Windows 구성 요소 라이브러리의 앱 패키지에 대한 경로를 지정합니다. 이 값은 로컬 디버깅 중에 Windows 구성 요소 라이브러리의 등록 구성 요소로 전달됩니다. 파일 이름의 명명 규칙은 <Company>.<Product>.<Architecture>.<Configuration>.<Version>.appx입니다. Windows 구성 요소 라이브러리에 적용되지 않는 경우 구성 및 아키텍처는 특성 이름 및 특성 값의 선택 사항입니다. 이 값은 Windows 구성 요소 라이브러리에만 적용됩니다.

  12. CopyRedistToSubDirectory: 앱 패키지 루트(즉, 앱 패키지 만들기 마법사에서 선택한 패키지 위치) 및 런타임 레이아웃 루트를 기준으로 \redist 폴더 아래의 파일을 복사할 위치를 지정합니다. 기본 위치는 앱 패키지 및 F5 레이아웃의 루트입니다.

  13. DependsOn: 이 SDK가 의존하는 SDK를 정의하는 SDK ID 목록입니다. 이 특성은 참조 관리자의 세부 정보 창에 나타납니다.

  14. MoreInfo: 도움말 및 자세한 정보를 제공하는 웹 페이지의 URL입니다. 이 값은 참조 관리자의 오른쪽 창에 있는 추가 정보 링크에서 사용됩니다.

  15. Registration Type: 앱 매니페스트에서 WinMD 등록을 지정하며 해당 구현 DLL이 있는 네이티브 WinMD에 필요합니다.

  16. File Reference: 컨트롤을 포함하거나 네이티브 WinMD인 참조에만 지정됩니다. 참조에 컨트롤이 포함되어 있는지 여부를 지정하는 방법에 대한 자세한 내용은 아래의 도구 상자 항목의 위치 지정을 참조하세요.

도구 상자 항목의 위치 지정

SDKManifest.xml 스키마의 ToolBoxItems 요소는 플랫폼 및 확장 SDK 모두에서 도구 상자 항목의 컨트롤 이름, 소스 어셈블리, 도구 상자 탭 이름을 지정합니다. 다음 예제에서는 다양한 시나리오를 보여 줍니다. 이는 WinMD 또는 DLL 참조에 적용할 수 있습니다.

Visual Studio 2019 및 이전 버전에서는 매니페스트에 도구 상자 컨트롤 이름을 나열하는 대신 Visual Studio에서 SDK 어셈블리의 컨트롤 형식을 동적으로 열거했습니다. Visual Studio 2022부터는 더 이상 지원되지 않습니다. 도구 상자 항목은 SDKManifest.xml에서 명시적으로 나열되어야 합니다.

  1. 도구 상자 기본 범주에 컨트롤을 배치합니다.

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Toolbox.Default">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  2. 특정 범주 이름 아래에 컨트롤을 배치합니다.

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory= "MyCategoryName">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  3. 특정 범주 이름 아래에 컨트롤을 배치합니다.

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Graph">
        <Item Type = "Namespace.ControlName1" />
      </ToolboxItems>
      <ToolboxItems VSCategory = "Data">
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  4. Blend 및 Visual Studio의 여러 범주 이름 아래에 컨트롤을 배치합니다.

    // Blend accepts a slightly different structure for the category name because it allows a path rather than a single category.
    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Graph" BlendCategory = "Controls/sample/Graph">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  5. Blend 및 Visual Studio에서 특정 컨트롤을 다르게 열거합니다.

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Graph">
        <Item Type = "Namespace.ControlName1" />
      </ToolboxItems>
      <ToolboxItems BlendCategory = "Controls/sample/Graph">
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  6. 특정 컨트롤을 열거하고 Visual Studio 공통 경로 아래에 배치하거나 또는 모든 컨트롤 그룹에만 배치합니다.

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Toolbox.Common">
        <Item Type = "Namespace.ControlName1" />
      </ToolboxItems>
      <ToolboxItems VSCategory = "Toolbox.All">
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>
    
  7. 특정 컨트롤을 열거하고 도구 상자에 없는 ChooseItems에 특정 집합만 표시합니다.

    <File Reference = "sample.winmd">
      <ToolboxItems VSCategory = "Toolbox.ChooseItemsOnly">
        <Item Type = "Namespace.ControlName1" />
        <Item Type = "Namespace.ControlName2" />
      </ToolboxItems>
    </File>