> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 框架包依赖

> 框架包依赖

如果你的应用一直依赖某些以框架包形式在 Microsoft Store 中提供的可再发行软件,那么你无需链式安装该可再发行组件,而可以直接声明对该框架包的依赖。但是,如果 Microsoft Store 没有为你所依赖的可再发行组件提供框架包,请不要使用此方式,而应考虑使用自定义安装操作。

## 详细信息

* 按正常方式开发你的应用,引用所需可再发行组件的导出库。

* 无需将所依赖的可再发行组件与应用打包在一起,而是在清单中声明对相关框架包的依赖。

* 当用户从 Microsoft Store 安装你的应用时,系统会检测该依赖,并确保该框架包对应用可用。

  如果框架包已经安装在用户的设备上,则不需要进一步操作。否则,Microsoft Store 会在继续安装引用该框架包的应用之前,先触发该框架包的安装。

* x86 版本的应用使用 x86 版本的框架包,x64 版本的应用使用 x64 版本的框架包。你无需为指定架构做任何事情,平台会为你处理。

## DirectX 运行时

此框架包提供来自旧版 DirectX SDK 的多个并存(side-by-side)的可选组件。如果你的应用使用了已弃用的 Direct3D 实用库 D3DX9、D3DX10 或 D3DX11,或者 XAudio 2.7、XInput 1.3 或 XACT,那么可以使用此包为你打包的 Win32 桌面应用部署这些已弃用的 DLL。有关这些组件的更多背景,请参见 [此博客文章](https://aka.ms/dxsetup)。

<Note>使用 DirectX 的绝大多数游戏 **并不** 真正需要这个“旧版 DirectX SDK”框架包依赖。</Note>

```
D3DCompiler_33.dl - D3DCompiler_43.dll
d3dcsx_42.dll, d3dcsx_43.dll
d3dx10.dll, d3dx10_33.dll - d3dx10_43.dll
d3dx11_42.dll, d3dx11_43.dll
d3dx9_24.dll - D3DX9_43.dll
```

```
x3daudio1_0.dll - X3DAudio1_7.dll
xactengine2_0.dll - xactengine2_9.dll
xactengine3_0.dll - xactengine3_7.dll
XAPOFX1_0.dll - XAPOFX1_5.dll
XAudio2_0.dll - XAudio2_7.dll
```

```
xinput1_1.dll - xinput1_3.dll
```

或者,你可以更新应用以移除对 [旧版 DirectX SDK](https://learn.microsoft.com/windows/win32/directx-sdk--august-2009-) 的依赖。

* 对于 **XAudio2**,最佳选择是使用 Windows 10 SDK 中的头文件升级到 XAudio 2.9。在 Windows 10 中,XAudio 2.9、X3DAudio 和 XAPOFX 都已内置于操作系统中。对于你的非 Store 版本,可以使用 [XAudio2Redist](https://aka.ms/XAudio2Redist),它提供了一个简单的应用本地可再发行组件,支持在 Windows 7 SP1 或更高版本上使用 XAudio2.9。这既简化了部署,又解决了旧版 XAudio 2.7 的许多已知 Bug。请参见 [Microsoft Docs](https://learn.microsoft.com/windows/win32/xaudio2/xaudio2-versions)。

* 对于 **XInput**,最佳选择是使用 Windows 10 SDK 中的头文件使用 XInput 1.4。在 Windows 10 中,XInput 1.4 已内置于操作系统中。对于你的非 Store 版本,可以使用 XInput 9.1.0,它一路向下兼容至 Windows Vista,内置于操作系统中。请参见 [此博客文章](https://aka.ms/Mu9kn7)。

> 强烈不建议使用旧版 XInput 1.3,因为它存在已知的安全问题。框架包中的版本已更新以缓解此问题并升级到 SHA-256 代码签名,但原始的旧版 DirectX End-User Runtime 包未做更改。

* 对于 **Direct3D 10**(`d3dx10`),最佳选择是升级到 Direct3D 11。请参见 [Microsoft Docs](https://learn.microsoft.com/windows/win32/direct3d11/d3d11-programming-guide-migrating)。

* 对于 **Direct3D 11**(`d3dx11`),关于替代旧版 D3DX for Direct3D 11 的各种方案,请参见 [此博客文章](https://aka.ms/Kfsdiu)。

> 对于较旧的游戏,你还可以考虑使用 [Microsoft.DXSDK.D3DX](https://www.nuget.org/packages/Microsoft.DXSDK.D3DX) NuGet 包,它提供了 D3DX9、D3DX10 和 D3DX11 的 2010 年 6 月版本,并采用并存许可证。这些可再发行 DLL 同样使用 SHA-256 代码签名。

* 对于 **HLSL 编译器**(`D3DCompiler`),你可以使用 Windows 10 SDK 中的最新版本。在 Windows 10 中,它内置于操作系统中。对于你的非 Store 版本,可以将 `D3DCompiler_47.dll` 作为简单的应用本地文件与游戏一起包含。请参见 [此博客文章](https://aka.ms/Tuoxjd)。

<Note>此框架包和旧版 DirectX End-User Redistributable 均不会以任何方式修改 DirectX 运行时。</Note>

`MicrosoftGame.config` 示例片段:

```xml theme={null}
<Game>

  <DesktopRegistration>
    <DependencyList>
      <KnownDependency Name="DX11"/>
    </DependencyList>
  </DesktopRegistration>

</Game>
```

有两种方法可将 DirectX 框架包安装到开发或测试机器上。

1. 从 Microsoft Downloads 站点下载,双击 Appx 文件安装(推荐)。[DirectX x86 框架包](https://aka.ms/directx_x86_appx),[DirectX x64 框架包](https://aka.ms/directx_x64_appx)
2. 在“运行”应用中输入以下链接,以获取一个安装 DirectX 框架依赖包的 DirectX 示例应用。(注意:这仅适用于位于 RETAIL 开发沙箱中的机器,并且只会在 x64 平台的机器上安装 x64 平台版本):ms-windows-store://pdp/?productid=9MTF6XHMN17Z

<Note>DirectX 框架包不会将这些 DLL 安装到 System32 文件夹中。它们位于你已打包应用运行时的搜索路径中。如果你在使用显式链接,请不要使用 `LoadLibraryEx` 的 `LOAD_LIBRARY_SEARCH_SYSTEM32` 或 `LOAD_LIBRARY_SEARCH_APPLICATION_DIR` 标志来加载这些旧版 DirectX 库。</Note>

> 此框架包的 9.29.1974.0 版本包括 SHA-256 代码签名的载荷 DLL,以及针对 XInput 1.3 的安全修复。

## Visual Studio C++ 运行时

对于 C/C++ 运行时这一特殊情况,传统的可再发行形式和框架包形式并不总是完全相同。传统的非 Microsoft Store 应用一直使用传统的可再发行形式。

| **Visual C/C++ 版本** | **建议**                                                                      |
| ------------------- | --------------------------------------------------------------------------- |
| 2015、2017、2019、2022 | 传统可再发行形式与框架包形式完全相同,你可以任选其一。不过,作为最佳实践,我们建议使用框架包。                             |
| 2013                | MSIXVC 打包的应用必须使用框架版本。否则,某些 API 可能行为异常。                                      |
| 2012                | MSIXVC 打包的应用必须使用框架版本。否则,某些 API 可能行为异常。                                      |
| 2010 及更早            | MSIXVC 打包的应用应将传统可再发行组件中的松散文件放入应用文件夹下的适当子文件夹中。对于这些版本,既不应使用传统可再发行形式,也不应使用框架包。 |

上文提到的安装程序会将必要的框架包放置在以下 *Extension SDKs* 文件夹中:

%PROGRAMFILES(X86)%\Microsoft SDKs\Windows Kits\10\ExtensionSDKs

请确保侧载与你的应用架构相对应的版本:x86 或 x64。

要在本地测试你的包及其框架依赖项,请确定你的应用是使用哪个版本的 Visual Studio 构建的,侧载对应的 APPX 框架包,然后注册你的应用。

有关详细信息,请参见 [Microsoft Docs](https://learn.microsoft.com/troubleshoot/cpp/c-runtime-packages-desktop-bridge)。

### Visual Studio 2012

以下是 Visual Studio 2012 VCLibs 框架包 v11 的清单示例条目。

```xml theme={null}
  <DesktopRegistration>
    <DependencyList>
      <KnownDependency Name="VC11"/>
    </DependencyList>
  </DesktopRegistration>
```

要侧载此框架包

* **x86:**

  1. 定位框架包:

     C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0\Appx\Retail\x86\Microsoft.VCLibs.x86.11.00.Desktop.appx

  2. 双击安装,或运行以下 Windows PowerShell 命令:

     `add-appxpackage "C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0\Appx\Retail\x86\Microsoft.VCLibs.x86.11.00.Desktop.appx"`

* **x64:**

  1. 定位框架包:

     C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0\Appx\Retail\x64\Microsoft.VCLibs.x64.11.00.Desktop.appx

  2. 双击安装,或运行以下 Windows PowerShell 命令:

     `add-appxpackage "C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0\Appx\Retail\x64\Microsoft.VCLibs.x64.11.00.Desktop.appx"`

### Visual Studio 2013

以下是 Visual Studio 2012 VCLibs 框架包 v12 的清单示例条目。

```xml theme={null}
  <DesktopRegistration>
    <DependencyList>
      <KnownDependency Name="VC12"/>
    </DependencyList>
  </DesktopRegistration>
```

要侧载此框架包

* **x86:**

  1. 定位框架包:

     C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\14.0\Appx\Retail\x86\Microsoft.VCLibs.x86.12.00.Desktop.appx

  2. 双击安装,或运行以下 Windows PowerShell 命令:

     `add-appxpackage "C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.110\14.0\Appx\Retail\x86\Microsoft.VCLibs.x86.11.00.Desktop.appx"`

* **x64:**

  1. 定位框架包:

     C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\14.0\Appx\Retail\x64\Microsoft.VCLibs.x64.12.00.Desktop.appx

  2. 双击安装,或运行以下 Windows PowerShell 命令:

     `add-appxpackage "C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop.120\14.0\Appx\Retail\x64\Microsoft.VCLibs.x64.12.00.Desktop.appx"`

### Visual Studio 2015 - 2022

以下是 Visual Studio 2015 或更高版本 VCLibs 框架包 v14 的清单示例条目。

```xml theme={null}
  <DesktopRegistration>
    <DependencyList>
      <KnownDependency Name="VC14"/>
    </DependencyList>
  </DesktopRegistration>
```

要侧载此框架包

* **x86:**

  1. 定位框架包:

     C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0\Appx\Retail\x86\Microsoft.VCLibs.x86.14.00.Desktop.appx

  2. 双击安装,或运行以下 Windows PowerShell 命令:

     `add-appxpackage "C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0\Appx\Retail\x86\Microsoft.VCLibs.x86.14.00.Desktop.appx"`

* **x64:**

  1. 定位框架包:

     C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0\Appx\Retail\x64\Microsoft.VCLibs.x64.14.00.Desktop.appx

  2. 双击安装,或运行以下 Windows PowerShell 命令:

     `add-appxpackage "C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0\Appx\Retail\x64\Microsoft.VCLibs.x64.14.00.Desktop.appx"`

请记住,VS 2015 Update 3、VS 2017、VS 2019 和 VS 2022 都使用同一个 REDIST,其中 VS 2022 是最新的。有关详细信息,请参见 [Microsoft Docs](https://learn.microsoft.com/cpp/porting/binary-compat-2015-2017)。

## 本地测试

在包含对相应清单的引用并侧载了 APPX 框架包后,使用以下命令安装应用的松散构建版本:

`WdApp.exe register loose_build_path`

这将确保你的应用被安装并引用正确的框架。现在从“开始”菜单的磁贴运行你的应用,然后针对你的应用执行必要的测试和验证步骤。

在完成侧载配置下的测试后,使用 [使用 MSIXVC 打包工具在 PC 上打包游戏入门](/build/core-features/common/packaging/overviews/packaging-getting-started-for-PC) 主题中的说明创建 MSIXVC 包。

有关更多详细信息,请参见博客文章
[Using Visual C++ Runtime in Centennial project](https://blogs.msdn.microsoft.com/vcblog/2016/07/07/using-visual-c-runtime-in-centennial-project/)。


## Related topics

- [使用 MSIXVC 工具打包 PC 游戏入门](/zh-CN/build/core-features/common/packaging/overviews/packaging-getting-started-for-PC.md)
- [针对 PC 的 MSIXVC2 打包入门](/zh-CN/build/core-features/common/packaging/overviews/packaging-getting-started-for-PC-msixvc2.md)
- [XBOX GDK 游戏的打包与部署](/zh-CN/build/core-features/common/packaging/index.md)
- [MicrosoftGame.config Element - KnownDependency](/zh-CN/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-knowndependency.md)
- [MicrosoftGame.config Element - Dependency](/zh-CN/reference/system/microsoftgameconfig/elements/microsoftgameconfig-element-dependency.md)
