Udostępnij za pośrednictwem


Używanie narzędzia winapp CLI z językiem C++ i systemem budowania CMake.

W tym przewodniku pokazano, jak używać interfejsu wiersza polecenia winapp z aplikacją języka C++ do debugowania przy użyciu tożsamości pakietu i spakowania aplikacji jako pliku MSIX.

Tożsamość pakietu jest podstawową koncepcją w modelu Windows app. Dzięki niej aplikacja może uzyskiwać dostęp do określonych interfejsów API systemu Windows (takich jak powiadomienia, zabezpieczenia, interfejsy API itp.), mieć czyste środowisko instalacji/odinstalowywania i wiele więcej.

Standardowy plik wykonywalny (taki jak utworzony za pomocą cmake --buildpolecenia ) nie ma tożsamości pakietu. W tym przewodniku pokazano, jak dodać go do debugowania, a następnie spakować go do dystrybucji.

Wymagania wstępne

  1. Narzędzia kompilacji: użyj łańcucha narzędzi kompilatora obsługiwanego przez narzędzie CMake. W tym przykładzie użyto Visual Studio. Możesz zainstalować wersję Community Edition za pomocą następujących funkcji:

    winget install --id Microsoft.VisualStudio.Community --source winget --override "--add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --passive --wait"
    

    Uruchom ponownie po instalacji.

  2. CMake: Zainstaluj narzędzie CMake:

    winget install Kitware.CMake --source winget
    
  3. winapp CLI: zainstaluj winapp CLI za pomocą winget

    winget install Microsoft.winappcli --source winget
    

1. Tworzenie nowej aplikacji języka C++

Zacznij od utworzenia prostej aplikacji języka C++. Utwórz nowy katalog dla projektu.

mkdir cpp-app
cd cpp-app

main.cpp Utwórz plik z podstawowym programem "Hello, world!":

#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

CMakeLists.txt Utwórz plik w celu skonfigurowania kompilacji:

cmake_minimum_required(VERSION 3.20)
project(cpp-app)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(cpp-app main.cpp)

Skompiluj i uruchom go, aby upewnić się, że wszystko działa:

cmake -B build
cmake --build build --config Debug
.\build\Debug\cpp-app.exe

2. Aktualizowanie kodu w celu sprawdzenia tożsamości

Zaktualizuj aplikację, aby sprawdzić, czy jest uruchomiona z tożsamością pakietu przy użyciu interfejsu API języka C++ Windows Runtime.

Najpierw zaktualizuj CMakeLists.txt, aby połączyć się z biblioteką Windows App Model:

cmake_minimum_required(VERSION 3.20)
project(cpp-app)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(cpp-app main.cpp)

# Link Windows Runtime libraries
target_link_libraries(cpp-app PRIVATE WindowsApp.lib OneCoreUap.lib)

Następnie zastąp zawartość elementu main.cpp:

#include <iostream>
#include <windows.h>
#include <appmodel.h>

int main() {
    UINT32 length = 0;
    LONG result = GetCurrentPackageFamilyName(&length, nullptr);

    if (result == ERROR_INSUFFICIENT_BUFFER) {
        std::wstring familyName;
        familyName.resize(length);

        result = GetCurrentPackageFamilyName(&length, familyName.data());

        if (result == ERROR_SUCCESS) {
            std::wcout << L"Package Family Name: " << familyName.c_str() << std::endl;
        } else {
            std::wcout << L"Error retrieving Package Family Name" << std::endl;
        }
    } else {
        std::cout << "Not packaged" << std::endl;
    }

    return 0;
}

3. Uruchamianie bez tożsamości

Skompiluj i uruchom aplikację:

cmake --build build --config Debug
.\build\Debug\cpp-app.exe

Powinien zostać wyświetlony komunikat "Nie spakowane". Potwierdza to, że standardowy plik wykonywalny jest uruchomiony bez żadnej tożsamości pakietu.

4. Zainicjuj projekt za pomocą interfejsu wiersza polecenia winapp

Polecenie winapp init konfiguruje wszystko, czego potrzebujesz: manifest aplikacji, zasoby oraz opcjonalnie nagłówki Windows App SDK na potrzeby programowania w języku C++.

winapp init

Po wyświetleniu monitu:

  • Nazwa pakietu: naciśnij klawisz Enter, aby zaakceptować wartość domyślną (cpp-app)
  • Nazwa wydawcy: Naciśnij klawisz Enter, aby zaakceptować wartość domyślną lub wprowadź swoją nazwę
  • Wersja: Naciśnij klawisz Enter, aby zaakceptować 1.0.0.0
  • Punkt wejścia: Naciśnij klawisz Enter, aby zaakceptować wartość domyślną (cpp-app.exe)
  • zestawy SDK Setup: Wybierz pozycję "Stabilne zestawy SDK", aby pobrać Windows App SDK i wygenerować nagłówki

To polecenie tworzy:

  • appxmanifest.xml i Assets foldery tożsamości Twojej aplikacji
  • Folder .winapp z nagłówkami i bibliotekami Windows App SDK
  • winapp.yaml Plik konfiguracyjny do przypinania wersji zestawu SDK

5. Debugowanie przy użyciu tożsamości

Aby przetestować funkcje wymagające tożsamości bez pełnego pakowania aplikacji, użyj polecenia winapp create-debug-identity:

  1. Skompiluj plik wykonywalny:

    cmake --build build --config Debug
    
  2. Zastosuj tożsamość debugowania:

    winapp create-debug-identity .\build\Debug\cpp-app.exe
    
  3. Uruchom plik wykonywalny:

    .\build\Debug\cpp-app.exe
    

Powinny zostać wyświetlone dane wyjściowe podobne do następujących:

Package Family Name: cpp-app_12345abcde

Automatyzowanie tożsamości debugowania (opcjonalnie)

Dodaj polecenie po zakończeniu budowania do elementu CMakeLists.txt, aby automatycznie zastosować identyfikator debugowania.

add_custom_command(TARGET cpp-app POST_BUILD
    COMMAND $<$<CONFIG:Debug>:winapp>
            $<$<CONFIG:Debug>:create-debug-identity>
            $<$<CONFIG:Debug>:$<TARGET_FILE:cpp-app>>
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMAND_EXPAND_LISTS
    COMMENT "Applying debug identity to executable..."
)

6. Używanie Windows App SDK (opcjonalnie)

Jeśli wybrano opcję konfigurowania zestawów SDK podczas winapp init, w folderze .winapp/include masz dostęp do nagłówków Windows App SDK.

Zaktualizuj CMakeLists.txt aby uwzględnić nagłówki:

# Add Windows App SDK include directory
target_include_directories(cpp-app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/.winapp/include)

Zaktualizuj main.cpp, aby korzystać z Windows App Runtime API:

#include <iostream>
#include <windows.h>
#include <appmodel.h>
#include <winrt/Microsoft.Windows.ApplicationModel.WindowsAppRuntime.h>

int main() {
    winrt::init_apartment();

    UINT32 length = 0;
    LONG result = GetCurrentPackageFamilyName(&length, nullptr);

    if (result == ERROR_INSUFFICIENT_BUFFER) {
        std::wstring familyName;
        familyName.resize(length);

        result = GetCurrentPackageFamilyName(&length, familyName.data());

        if (result == ERROR_SUCCESS) {
            std::wcout << L"Package Family Name: " << familyName.c_str() << std::endl;

            auto runtimeVersion = winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::RuntimeInfo::AsString();
            std::wcout << L"Windows App Runtime Version: " << runtimeVersion.c_str() << std::endl;
        }
    } else {
        std::cout << "Not packaged" << std::endl;
    }

    return 0;
}

7. Przywróć nagłówki w razie potrzeby

Folder .winapp zostanie automatycznie dodany do .gitignorefolderu . Gdy inne osoby sklonują project, muszą przywrócić następujące pliki:

winapp restore
winapp cert generate --if-exists skip

8. Pakiet z plikiem MSIX

Gdy wszystko będzie gotowe do dystrybucji, spakuj go jako plik MSIX:

  1. Kompilacja do wydania:

    cmake --build build --config Release
    
  2. Przygotuj katalog pakietów:

    mkdir dist
    copy .\build\Release\cpp-app.exe .\dist\
    
  3. Generowanie certyfikatu programistycznego:

    winapp cert generate --if-exists skip
    
  4. Pakowanie i podpisywanie:

    winapp pack .\dist --cert .\devcert.pfx
    
  5. Zainstaluj certyfikat (uruchom jako administrator):

    winapp cert install .\devcert.pfx
    
  6. Instalowanie i uruchamianie:

    Add-AppxPackage .\cpp-app.msix
    cpp-app
    

Wskazówka

  • Podpisz plik MSIX przy użyciu certyfikatu podpisywania kodu z urzędu certyfikacji na potrzeby dystrybucji produkcyjnej.
  • Sklep Microsoft Store podpisuje plik MSIX, dlatego nie trzeba się podpisywać przed przesłaniem.
  • Może być konieczne oddzielne pakiety MSIX dla każdej obsługiwanej architektury (x64, Arm64).