# バッチ設計書 41-GenerateAppxFromManifest

## 概要

SxS（Side-by-Side）マニフェストファイルからアクティベータブルクラス情報を抽出し、AppxManifest.xmlにInProcessServer拡張として追加するPowerShellスクリプトの設計書である。

### 本バッチの処理概要

本バッチは、Windows Side-by-Side（SxS）マニフェストに記載されたアクティベータブルクラス（COM/WinRTクラス）の定義を読み取り、UWP/MSIX向けのAppxManifest.xmlに`windows.activatableClass.inProcessServer`拡張として自動的に追加する処理を行う。

**業務上の目的・背景**：Windows TerminalプロジェクトではC++/WinRTコンポーネントが複数存在し、各コンポーネントのアクティベータブルクラスをAppxManifestに手動で記載するのは煩雑でミスが発生しやすい。SxSマニフェストから自動生成することで、ビルドプロセスの自動化と整合性の確保を実現する。

**バッチの実行タイミング**：ビルドプロセスの一部として随時実行される。AppXパッケージのビルド時にMSBuildから呼び出される。

**主要な処理内容**：
1. SxSマニフェストXMLファイルの読み込みとパース
2. AppxManifestプロトタイプXMLファイルの読み込み
3. SxSマニフェスト内の各fileエントリからアクティベータブルクラス情報を抽出
4. Extensions要素の構築（InProcessServer/ActivatableClass要素の生成）
5. 構築したExtensionsをAppxManifestに追加して出力ファイルに保存

**前後の処理との関連**：ビルドシステム（MSBuild）の一部として動作する。前提としてSxSマニフェストが生成済みであること、後続処理としてAppXパッケージングが行われる。

**影響範囲**：AppxManifest.xmlの内容に影響し、最終的にパッケージされるアプリケーションのCOM/WinRTクラス登録に影響する。

## バッチ種別

コード生成（XMLトランスフォーメーション）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（ビルド時） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | MSBuildビルドプロセス |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SxSマニフェストの存在 | 入力となるSxSマニフェストファイルが存在すること |
| AppxManifestプロトタイプの存在 | ベースとなるAppxManifest.xmlファイルが存在すること |
| PowerShell実行環境 | PowerShellが利用可能であること |

### 実行可否判定

3つの必須パラメータ（SxSManifest、AppxManifestPrototype、OutPath）がすべて指定されていること。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| SxSManifest | string | Yes | なし | SxSマニフェストファイルのパス |
| AppxManifestPrototype | string | Yes | なし | AppxManifest.xmlプロトタイプのパス |
| OutPath | string | Yes | なし | 出力先ファイルパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| SxSManifest | XML | assembly/file/activatableClass構造を持つSxSマニフェスト |
| AppxManifestPrototype | XML | Package要素を持つAppxManifest.xmlテンプレート |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| OutPathで指定されたファイル | XML | Extensions要素が追加されたAppxManifest.xml |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | OutPathパラメータで指定 |
| 出力先 | OutPathパラメータで指定 |
| 文字コード | UTF-8（XML標準） |
| 区切り文字 | N/A（XML形式） |

## 処理フロー

### 処理シーケンス

```
1. SxSマニフェストXMLの読み込み
   └─ Get-Content + [xml]キャストでXMLオブジェクトに変換
2. AppxManifestプロトタイプXMLの読み込み
   └─ Get-Content + [xml]キャストでXMLオブジェクトに変換
3. ルート名前空間の取得
   └─ Package要素のNamespaceURIを取得（xmlns=""問題の回避）
4. Extensions要素の作成
   └─ CreateNodeで適切な名前空間を持つExtensions要素を生成
5. SxSマニフェストの各fileエントリを反復処理
   └─ 5a. Extension要素の生成（Category="windows.activatableClass.inProcessServer"）
   └─ 5b. InProcessServer要素の生成
   └─ 5c. Path要素の生成（DLLファイル名を設定）
   └─ 5d. 各activatableClassについてActivatableClass要素の生成
        └─ ActivatableClassId属性とThreadingModel属性を設定
   └─ 5e. 構築した要素ツリーをExtensionsに追加
6. ExtensionsをPackage要素に追加
   └─ AppendChildでPackage直下に配置
7. 変更後のXMLをOutPathに保存
   └─ XMLDocument.save()メソッドで出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[SxSマニフェストXML読み込み]
    B --> C[AppxManifestプロトタイプXML読み込み]
    C --> D[ルート名前空間取得]
    D --> E[Extensions要素作成]
    E --> F{fileエントリあり?}
    F -->|あり| G[Extension/InProcessServer/Path要素生成]
    G --> H{activatableClassあり?}
    H -->|あり| I[ActivatableClass要素生成・追加]
    I --> H
    H -->|なし| J[ExtensionsにExtension追加]
    J --> F
    F -->|なし| K[PackageにExtensions追加]
    K --> L[XMLファイル保存]
    L --> M[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチではデータベース操作は行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | ファイル未検出 | SxSManifestまたはAppxManifestPrototypeが存在しない | パスを確認し、ファイルが存在することを確認 |
| N/A | XMLパースエラー | 入力ファイルが不正なXML | 入力ファイルのXML構造を確認 |
| N/A | 書き込みエラー | OutPathへの書き込み権限がない | 出力先ディレクトリの権限を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（リトライ機構なし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

スクリプトが失敗した場合、入力ファイルの存在と内容を確認し、再実行する。出力ファイルは上書きされるため、冪等性がある。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイル操作のみ） |
| コミットタイミング | XML保存時に一括書き込み |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数個〜数十個のactivatableClass |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 特に制約なし（XMLサイズ依存） |

## 排他制御

同一出力ファイルに対して同時実行しないこと。ビルドシステムの依存関係により制御される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 標準出力 | N/A | 明示的なログ出力なし |
| デバッグ出力 | N/A | コメントアウトされたデバッグコードあり（XML文字列出力） |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ビルド失敗 | N/A | ビルドシステム（MSBuild/CI） |

## 備考

- 名前空間の取り扱いが重要：Package要素と同じ名前空間でExtension要素を生成しないと、AppXデプロイメントが拒否する`xmlns=""`属性が付与される問題がある。
- スクリプト末尾にデバッグ用のXML出力コードがコメントアウトされた状態で残されている。
- ソースファイルパス: `tools/GenerateAppxFromManifest.ps1`
