建立軟體開發套件
軟體開發套件 (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\Microsoft SDKs\[TPI]\v[TPV]\@InstallationFolder = [SDK 根目錄]。 因此,Windows 8.1 SDK 會安裝在 HKLM\Software\Microsoft\Microsoft SDKs\Windows\v8.1。
版面配置
平台 SDK 具有下列設定:
\[InstallationFolder root]
SDKManifest.xml
\References
\[config]
\[arch]
\DesignTime
\[config]
\[arch]
節點 | 描述 |
---|---|
References 資料夾 | 包含二進位檔,其中包含可對其編碼的 API。 這些可能包含 Windows 中繼資料 (WinMD) 檔案或組件。 |
DesignTime 資料夾 | 包含只在執行前/偵錯階段才需要的檔案。 這些可能包含 XML 文件、程式庫、標頭、工具箱設計階段二進位檔、MSBuild 成品等等 在理想情況下,XML 文件會放在 \DesignTime 資料夾中,但供參考的 XML 文件會繼續放在 Visual Studio 中的參考檔案旁邊。 例如,參考 \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,而且不應該將從它新增的參考複製在本機。 TargetFramework:Visual Studio 使用這個屬性來確保只有以此屬性值中指定的相同 Framework 為目標的專案才能取用 SDK。 MinVSVersion:Visual Studio 使用此屬性只取用套用至它的 SDK。 Reference:必須只針對包含控制項的參考指定這個屬性。 如需如何指定參考是否包含控制項的資訊,請參閱下方。 |
擴充功能 SDK
下列各節說明部署延伸模組 SDK 所需的動作。
安裝
延伸模組 SDK 可以針對特定使用者或所有使用者安裝,而無須指定登錄機碼。 若要為所有使用者安裝 SDK,請使用下列路徑:
%Program Files%\Microsoft SDKs<目標平台>\v<平台版本號碼>\ExtensionSDKs
對於使用者特定的安裝,請使用下列路徑:
%USERPROFILE%\AppData\Local\Microsoft SDKs<目標平台>\v<平台版本號碼>\ExtensionSDKs
如果您想要使用不同的位置,必須執行下列兩個動作之一:
在登錄機碼中指定:
HKLM\Software\Microsoft\Microsoft SDKs<目標平台>\v<平台版本號碼>\ExtensionSDKs<SDKName><SDKVersion>\
並新增具有
<path to SDK><SDKName><SDKVersion>
值的 (預設) 子機碼。將 MSBuild 屬性
SDKReferenceDirectoryRoot
新增至您的專案檔。 這個屬性的值是以分號分隔的清單,您要參考的延伸模組 SDK 位於其中。
安裝配置
延伸模組 SDK 具有下列安裝配置:
\<ExtensionSDKs root>
\<SDKName>
\<SDKVersion>
SDKManifest.xml
\References
\<config>
\<arch>
\Redist
\<config>
\<arch>
\DesignTime
\<config>
\<arch>
\<SDKName>\<SDKVersion>:延伸模組 SDK 的名稱和版本衍生自 SDK 根目錄路徑中的相對應資料夾名稱。 MSBuild 使用此身分識別在磁碟上尋找 SDK,而 Visual Studio 會在 [屬性] 視窗和 [參考管理員] 對話方塊中顯示此身分識別。
References 資料夾:包含 API 的二進位檔。 這些可能是 Windows 中繼資料 (WinMD) 檔案或組件。
Redist 資料夾:執行階段/偵錯所需的檔案,而且應該封裝為使用者應用程式的一部分。 所有二進位檔都應該放在 \redist\<config>\<arch> 底下,而且二進位檔名稱應具有下列格式,以確保唯一性:]<公司>.<產品>.<>.<延伸模組>。例如,*Microsoft.Cpp.Build.dll。 名稱可能與其他 SDK 的檔名相衝突的所有檔案 (例如,javascript、css、pri、xaml、png 和 jpg 檔案) 都應該放在 \redist\<config>\<arch>\<sdkname>* 底下,但與 XAML 控制項相關聯的檔案除外。這些檔案應該放在 *\redist\<config>\<arch>\<componentname>\ 下方。
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。
Configuration 資料夾:三個子資料夾:Debug、Retail 和 CommonConfiguration。 無論 SDK 取用者將組態目標為何,當應該取用相同的 SDK 檔案集,SDK 作者都可以將其檔案放在 CommonConfiguration 之下。
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>
下列清單提供該檔案的元素:
DisplayName:出現在 Visual Studio 使用者介面中參考管理員、方案總管、物件瀏覽器和其他位置的值。
ProductFamilyName:整體 SDK 產品名稱。 例如,Windows Library for JavaScript (WinJS) SDK 的名稱為「Microsoft.WinJS.1.0」和「Microsoft.WinJS.2.0」,屬於同一系列 SDK 產品系列「Microsoft.WinJS」。 此屬性可讓 Visual Studio 和 MSBuild 建立該關聯。 如果此屬性不存在,SDK 名稱會當做產品系列名稱使用。
FrameworkIdentity:指定一或多個 Windows 元件庫的相依性。 這個屬性的值會放入取用應用程式的資訊清單中。 此屬性僅適用於 Windows 元件庫。
TargetFramework:指定參考管理員和工具箱中可用的 SDK。 這是以分號分隔的目標架構 Moniker 清單,例如 “.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。
MinVSVersion:最低 Visual Studio 版本。
MaxPlatformVerson:應該使用目標平台版本上限來指定延伸模組 SDK 無法運作的平台版本。 例如,只有 Windows 8 專案應該參考 Microsoft Visual C++ 執行階段套件 v11.0。 因此,Windows 8 專案的 MaxPlatformVersion 是 8.0。 這表示對於 Windows 8.1 專案,參考管理員會篩選出 Microsoft Visual C++ 執行階段套件,而 MSBuild 會在 Windows 8.1 專案參考時擲回錯誤。 注意:從 Visual Studio 2013 開始支援此元素。
AppliesTo:藉由指定適用的 Visual Studio 專案類型,指定參考管理員中可用的 SDK。 可辨識九個值:WindowsAppContainer、VisualC、VB、CSharp、WindowsXAML、JavaScript、Managed 和 Native。 SDK 作者可以使用 and ("+"),or ("|"),not ("!") 運算子,來指定套用至 SDK 的專案類型範圍。
WindowsAppContainer 會識別 Windows 8.x 市集應用程式的專案。
SupportPrefer32Bit:支援的值為 “True” 和 “False”。 預設值為 "True"。 如果此值設定為 "False",如果參考 SDK 的專案已啟用 Prefer32Bit,MSBuild 會對 Windows 8.x 市集專案傳回錯誤 (或對桌面專案發出警告)。 如需 Prefer32Bit 的詳細資訊,請參閱建置頁面,專案設計工具 (C#) 或編譯頁面,專案設計工具 (Visual Basic)。
SupportedArchitectures:SDK 支援的架構清單 (以分號分隔)。 如果取用專案中的目標 SDK 架構不受支援,MSBuild 會顯示警告。 如果未指定此屬性,MSBuild 永遠不會顯示這類警告。
SupportsMultipleVersions:如果此屬性設定為 Error 或 Warning,MSBuild 會指出相同的專案無法參考相同 SDK 系列的多個版本。 如果此屬性不存在或設定為 Allow,MSBuild 就不會顯示這類的錯誤或警告。
AppX:指定磁碟上 Windows 元件庫之應用程式套件的路徑。 此值會在本機偵錯期間傳遞至 Windows 元件庫的註冊元件。 檔名的命名慣例是 <公司>.<產品>.<架構>.<組態>.<版本>.appx。 如果組態和架構不適用於 Windows 元件庫,則組態和架構在屬性名稱和屬性值中是選擇性的。 此值僅適用於 Windows 元件庫。
CopyRedistToSubDirectory:指定應該複製 \redist 資料夾下的檔案的應用程式套件根目錄的相對位置 (也就是「建立應用程式套件」精靈中選擇的 [套件位置]) 和執行階段配置根目錄。 預設位置是應用程式套件的根目錄和 F5 配置。
DependsOn:定義此 SDK 所依賴 SDK 的 SDK 身分識別清單。 此屬性會出現在參考管理員的詳細資料窗格中。
MoreInfo:提供說明和詳細資訊的網頁 URL。 此值用於參考管理員右窗格中的 [更多資訊] 連結。
註冊類型:指定應用程式資訊清單中的 WinMD 註冊,而且原生 WinMD 需要此項,其具有對應的實作 DLL。
檔案參考:僅針對包含控制項或原生 WinMD 的參考指定。 如需如何指定參考是否包含控制項的資訊,請參閱下方的指定工具箱項目的位置。
指定工具箱項目的位置
SDKManifest.xml 結構描述的 ToolBoxItems 元素會指定平台和延伸模組 SDK 中工具箱項目的控制項名稱、來源組件和工具箱索引標籤名稱。 下列範例舉出各種案例。 這適用於 WinMD 或 DLL 參考。
請注意,在 Visual Studio 2019 和更早版本中,Visual Studio 不會在資訊清單中列出工具箱控制項名稱,而是動態列舉 SDK 元件中的控制項類型。 從 Visual Studio 2022 開始,不再支援這項功能;工具箱項目必須明確列在 SDKManifest.xml 中。
將控制項放在工具箱預設類別中。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory = "Toolbox.Default"> <Item Type = "Namespace.ControlName1" /> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>
將控制項放在特定類別名稱之下。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory= "MyCategoryName"> <Item Type = "Namespace.ControlName1" /> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>
將控制項放在特定類別名稱之下。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory = "Graph"> <Item Type = "Namespace.ControlName1" /> </ToolboxItems> <ToolboxItems VSCategory = "Data"> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>
將控制項放在 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>
在 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>
列舉特定控制項,並將其放在 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>
列舉特定控制項,並且只顯示 ChooseItems 中的特定集合,而不會將它們放在工具箱中。
<File Reference = "sample.winmd"> <ToolboxItems VSCategory = "Toolbox.ChooseItemsOnly"> <Item Type = "Namespace.ControlName1" /> <Item Type = "Namespace.ControlName2" /> </ToolboxItems> </File>