### Execute installation check at app startup Source: https://github.com/yehudakremer/msix/wiki/How-To-Install-WebView2-Runtime-With-Msix-Flutter Call the installation check at the beginning of your application execution. ```dart import 'webview_install.dart'; if (!isWebView2RuntimeIsInstalled()) { await installWebView2(); } ``` -------------------------------- ### Create an MSIX installer Source: https://github.com/yehudakremer/msix/blob/main/README.md Run this command to generate the MSIX installer for your application. ```console dart run msix:create ``` -------------------------------- ### Context Menu Configuration Example Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md A full example showing how to define the context menu, including the required DLL path and various item types like files, directories, and background triggers. ```yaml msix_config: display_name: Flutter App context_menu: # <-- Context Menu configuration dll_path: path/to/your/context_menu.dll # required items: - type: "*" # <-- * means all files commands: - id: Command1 clsid: replace-with-your-guid-CDB3EAED7496 custom_dll: path/to/your/custom/dll.dll # optional - type: Directory # <-- Directory means folders commands: - id: Command1 clsid: replace-with-your-guid-CDB3EAED7496 - type: Directory\Background # <-- Directory\Background means background commands: - id: Command1 clsid: replace-with-your-guid-CDB3EAED7496 - type: .txt # <-- .txt means only .txt files commands: - id: Command1 clsid: replace-with-your-guid-CDB3EAED7496 - id: Command2 clsid: replace-with-your-guid-CDB3EAED4497 - id: Command3 clsid: replace-with-your-guid-CDB3EAED8498 msix_version: 1.0.3.0 ``` -------------------------------- ### App Installer configuration in pubspec.yaml Source: https://github.com/yehudakremer/msix/blob/main/README.md Example configuration block for the msix_config section to enable App Installer features. ```yaml msix_config: display_name: Flutter App app_installer: #<-- app installer configuration publish_folder_path: c:\path\to\myPublishFolder hours_between_update_checks: 0 automatic_background_task: true update_blocks_activation: true show_prompt: true force_update_from_any_version: false msix_version: 1.0.3.0 ``` -------------------------------- ### Create webview_install.dart for runtime detection and installation Source: https://github.com/yehudakremer/msix/wiki/How-To-Install-WebView2-Runtime-With-Msix-Flutter This file contains the logic to check the Windows registry for the WebView2 Runtime and execute the installer process. ```dart import 'dart:ffi'; import 'dart:io'; import 'package:ffi/ffi.dart'; import 'package:win32/win32.dart'; bool isWebView2RuntimeIsInstalled() { var webView2RuntimeRegKey = r'SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' .toNativeUtf16(); var webView2RuntimeReg64Key = r'SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' .toNativeUtf16(); final phKey = calloc(); var isInstalled = RegOpenKeyEx(HKEY_LOCAL_MACHINE, webView2RuntimeRegKey, 0, KEY_READ, phKey) == ERROR_SUCCESS || RegOpenKeyEx(HKEY_LOCAL_MACHINE, webView2RuntimeReg64Key, 0, KEY_READ, phKey) == ERROR_SUCCESS; free(phKey); free(webView2RuntimeRegKey); free(webView2RuntimeReg64Key); return isInstalled; } Future installWebView2() async { await Process.run('myAssets/MicrosoftEdgeWebview2Setup.exe', ['/silent', '/install']); // remove '/silent' for interactable installation } ``` -------------------------------- ### MSIX Configuration for CI/CD Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Example setup for CI/CD environments, disabling automatic certificate installation. ```yaml name: flutter_app version: 1.3.2 # ... msix_config: display_name: Flutter App install_certificate: false ``` -------------------------------- ### Basic MSIX Configuration Source: https://github.com/yehudakremer/msix/blob/main/example/README.md A minimal configuration example defining the display name, version, and logo path. ```yaml msix_config: display_name: Flutter App msix_version: 1.0.0.0 logo_path: C:\path\to\logo.png ``` -------------------------------- ### Run msix:publish command Source: https://github.com/yehudakremer/msix/blob/main/README.md Executes the publishing process to generate the App Installer file after configuring the publish_folder_path. ```console dart run msix:publish ``` -------------------------------- ### Pack MSIX files Source: https://github.com/yehudakremer/msix/blob/main/README.md Run this command to create an MSIX installer file after you have finished editing the files in the build folder. ```console dart run msix:pack ``` -------------------------------- ### Context Menu Item Type Example Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md Example of defining an item type. Note that the wildcard '*' must be enclosed in double quotes to be parsed correctly as a string. ```yaml - type: "*" # <-- * means all files commands: ... ``` -------------------------------- ### Install dependencies in pubspec.yaml Source: https://github.com/yehudakremer/msix/wiki/How-To-Install-WebView2-Runtime-With-Msix-Flutter Add the ffi and win32 packages to your project dependencies. ```yaml dependencies: ffi: ^1.1.2 win32: ^2.3.0 ``` -------------------------------- ### Command Structure Example Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md The structure for individual commands, including required ID and CLSID fields, and an optional custom DLL path. ```yaml - id: Command1 # required (Grab this from your dll source code) clsid: replace-with-your-guid-CDB3EAED7496 # required (Grab this from your dll source code) custom_dll: path/to/your/custom/dll.dll # optional (pass if you want to use a custom dll for this command) ``` -------------------------------- ### Implement dllmain.cpp for Context Menu Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md This code provides the boilerplate for a DLL entry point and a class structure for an IExplorerCommand. You must replace the UUID in the YourAppMenuCommand class with a unique GUID generated in Visual Studio. ```cpp #include "pch.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Microsoft::WRL; HINSTANCE g_hInst = 0; BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hInst = hModule; break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // This function is for to get out flutter application folder. It also comes from microsoft. // https://github.com/microsoft/PowerToys/blob/3443c73d0e81a958974368763631035f3e510653/src/common/utils/process_path.h inline std::wstring get_module_folderpath(HMODULE mod = nullptr, const bool removeFilename = true) { wchar_t buffer[MAX_PATH + 1]; DWORD actual_length = GetModuleFileNameW(mod, buffer, MAX_PATH); if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { const DWORD long_path_length = 0xFFFF; // should be always enough std::wstring long_filename(long_path_length, L'\0'); actual_length = GetModuleFileNameW(mod, (LPWSTR)long_filename.data(), long_path_length); PathRemoveFileSpecW((LPWSTR)long_filename.data()); long_filename.resize(std::wcslen(long_filename.data())); long_filename.shrink_to_fit(); return long_filename; } if (removeFilename) { PathRemoveFileSpecW(buffer); } return { buffer, (UINT)lstrlenW(buffer) }; } // ᐯ This is the "clsid" you need to pass into your context_menu command configuration. YOU NEED TO CHANGE UUID WITH YOURS. GENERATE A NEW ONE. class __declspec(uuid("change-that-withyour-uniqueguid")) YourAppMenuCommand final : public RuntimeClass, IExplorerCommand, IObjectWithSite> { // ᐱ This is the "id" you need to pass into your context menu command configuration public: // ᐯ Change that line with what do you want to show on context menu virtual const wchar_t* Title() { return L"Context Menu Item Text"; }; virtual const EXPCMDFLAGS Flags() { return ECF_DEFAULT; } virtual const EXPCMDSTATE State(_In_opt_ IShellItemArray* selection) { return ECS_ENABLED; } ``` -------------------------------- ### Configure MSIX in pubspec.yaml Source: https://github.com/yehudakremer/msix/blob/main/README.md Customize installer settings like display name, publisher, identity, version, logo path, and Windows capabilities by adding an msix_config node to your pubspec.yaml file. ```yaml msix_config: display_name: Flutter App publisher_display_name: Company Name identity_name: company.suite.flutterapp msix_version: 1.0.0.0 logo_path: C:\path\to\logo.png capabilities: internetClient, location, microphone, webcam ``` -------------------------------- ### Toast Notifications YAML configuration Source: https://github.com/yehudakremer/msix/blob/main/doc/toast_notifications_configuration.md Example of the msix_config structure used to define toast notification settings within the project configuration. ```yaml msix_config: display_name: Flutter App toast_activator: #<-- toast notifications configuration clsid: A1232234-1234-1234-1234-123412341234 arguments: "1,2,3" display_name: "TEST" msix_version: 1.0.3.0 ``` -------------------------------- ### Flutter MSIX File System Isolation Example Source: https://github.com/yehudakremer/msix/wiki/Application-Folder-And-Files A Flutter application demonstrating the creation, listing, and deletion of files within a virtualized directory path using the AppData environment variable. ```dart import 'dart:io'; import 'dart:math'; import 'package:flutter/material.dart'; String myFolderPath = '${Platform.environment['AppData']}\MyFolder'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return const MaterialApp( home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({Key? key}) : super(key: key); @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { bool isMyFolderExists = false; List files = []; _MyHomePageState() { checkMyFolder(); } Future createMyFolder() async { await Directory(myFolderPath).create(); await checkMyFolder(); } Future deleteMyFolder() async { await Directory(myFolderPath).delete(recursive: true); await checkMyFolder(); } Future createRandomFileInMyFolder() async { final String fileName = '${Random().nextInt(100)}'; final File file = File('$myFolderPath\$fileName.txt'); await file.create(); await checkMyFolder(); } Future checkMyFolder() async { bool myFolderExists = await Directory(myFolderPath).exists(); List myFolderFileNames = []; if (myFolderExists) { var myFolderEntities = await Directory(myFolderPath).list().toList(); myFolderFileNames = myFolderEntities.map((e) => e.path).toList(); } setState(() { isMyFolderExists = myFolderExists; files = myFolderFileNames; }); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: createMyFolder, child: const Text( 'Create My Folder', ), ), Container(width: 10), isMyFolderExists ? ElevatedButton( onPressed: deleteMyFolder, child: const Text( 'Delete My Folder', ), ) : const Text(''), Container(width: 10), isMyFolderExists ? ElevatedButton( onPressed: createRandomFileInMyFolder, child: const Text( 'create random file in my folder', ), ) : const Text(''), ], ), Text( isMyFolderExists ? 'is my folder exists in: $myFolderPath' : 'my folder not exists in: $myFolderPath', style: TextStyle( color: isMyFolderExists ? Colors.green : Colors.red, ), ), Column( children: files.map((e) => Text(e)).toList(), ), ], ), ), ); } } ``` -------------------------------- ### Configure msix_config for Assets Source: https://github.com/yehudakremer/msix/wiki/How-To-Create-Desktop-Shortcut Add the execution alias and specify the assets directory path in your msix_config to include the shortcut file in the installer. ```yaml add_execution_alias: true assets_directory_path: 'C:\Users\me\Desktop\your_project_path\myAssets' ``` -------------------------------- ### Install msix as a dev dependency Source: https://github.com/yehudakremer/msix/blob/main/README.md Add the msix package to your project's dev dependencies using the Flutter CLI. ```console flutter pub add --dev msix ``` -------------------------------- ### Implement Shell Context Menu Interface in Dllmain.cpp Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md This snippet contains the implementation of the IExplorerCommand interface methods, including GetTitle, GetIcon, GetState, and Invoke. It demonstrates how to customize the menu item appearance and handle user interaction by launching an executable with selected file paths. ```cpp IFACEMETHODIMP GetTitle(_In_opt_ IShellItemArray* items, _Outptr_result_nullonfailure_ PWSTR* name) { *name = nullptr; // ᐯ Change that line with what do you want to show on context menu return SHStrDupW(L"Context Menu Item Text", name); } IFACEMETHODIMP GetIcon(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* icon) { std::wstring iconResourcePath = get_module_folderpath(g_hInst); // this is what icon will shown on context menu. Add your ico file on your assets (on flutter side) and dont forget adding it to the pubspec file // '\data\flutter_assets' is the exact location where flutter put your assets for your application. // ᐯ also dont forget to change icon name iconResourcePath += L"\\data\\flutter_assets\\assets\\your_context_menu_icon.ico"; return SHStrDup(iconResourcePath.c_str(), icon); } IFACEMETHODIMP GetToolTip(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* infoTip) { *infoTip = nullptr; return E_NOTIMPL; } IFACEMETHODIMP GetCanonicalName(_Out_ GUID* guidCommandName) { *guidCommandName = GUID_NULL; return S_OK; } IFACEMETHODIMP GetState(_In_opt_ IShellItemArray* selection, _In_ BOOL okToBeSlow, _Out_ EXPCMDSTATE* cmdState) { if (nullptr == selection) { *cmdState = ECS_HIDDEN; return S_OK; } *cmdState = ECS_ENABLED; return S_OK; } // This is the function will be called when user clicked to the item // What we basically do here is just getting file/directory paths where/what user selected and send them to our flutter application (with arguments) // So as you can imagine this will open another instance of your app. If you don't want that search for what ipc is. IFACEMETHODIMP Invoke(_In_opt_ IShellItemArray* selection, _In_opt_ IBindCtx*) noexcept try { HWND parent = nullptr; if (m_site) { ComPtr oleWindow; RETURN_IF_FAILED(m_site.As(&oleWindow)); RETURN_IF_FAILED(oleWindow->GetWindow(&parent)); } std::wostringstream itemPaths; if (selection) { DWORD count = 0; selection->GetCount(&count); for (DWORD i = 0; i < count; i++) { IShellItem* shellItem; selection->GetItemAt(i, &shellItem); LPWSTR itemName; // Retrieves the entire file system path of the file from its shell item shellItem->GetDisplayName(SIGDN_FILESYSPATH, &itemName); CString fileName(itemName); itemPaths << L"\"" << std::wstring(fileName) << L"\"" << L" "; } std::wstring executablePath = get_module_folderpath(g_hInst); // ᐯ YOU NEED TO CHANGE THIS NAME WITH YOUR APPLICATION executablePath += L"\\your_application.exe"; ShellExecute(NULL, L"open", executablePath.c_str(), itemPaths.str().c_str(), get_module_folderpath(g_hInst).c_str(), SW_SHOWDEFAULT); } return S_OK; } CATCH_RETURN(); IFACEMETHODIMP GetFlags(_Out_ EXPCMDFLAGS* flags) { *flags = Flags(); return S_OK; } IFACEMETHODIMP EnumSubCommands(_COM_Outptr_ IEnumExplorerCommand** enumCommands) { *enumCommands = nullptr; return E_NOTIMPL; } IFACEMETHODIMP SetSite(_In_ IUnknown* site) noexcept { m_site = site; return S_OK; } IFACEMETHODIMP GetSite(_In_ REFIID riid, _COM_Outptr_ void** site) noexcept { return m_site.CopyTo(riid, site); } protected: ComPtr m_site; }; // ᐯ If you change the class name you need to change this line too. CoCreatableClass(YourAppMenuCommand) // ᐯ And this CoCreatableClassWrlCreatorMapInclude(YourAppMenuCommand) STDAPI DllGetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ IActivationFactory** factory) { return Module::GetModule().GetActivationFactory(activatableClassId, factory); } STDAPI DllCanUnloadNow() { return Module::GetModule().GetObjectCount() == 0 ? S_OK : S_FALSE; } STDAPI DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _Outptr_ LPVOID FAR* ppv) { return Module::GetModule().GetClassObject(rclsid, riid, ppv); } ``` -------------------------------- ### Implement Shortcut Copy Logic in main.dart Source: https://github.com/yehudakremer/msix/wiki/How-To-Create-Desktop-Shortcut Use this function to check if the application is running for the first time and copy the .lnk file from the assets folder to the user's desktop. ```dart Future _moveLnkFileToDesktop() async { // "my_app_name" is the value of "name:" in your pubspec.yaml String myAppDataPath = '${Platform.environment['AppData']}\my_app_name'; try { var myAppDataDirectoryExists = await Directory(myAppDataPath).exists(); //if myAppDataDirectoryExists is false then the app is running for the first time if (!myAppDataDirectoryExists) { await Directory(myAppDataPath).create(); await File('${File(Platform.resolvedExecutable).parent.path}\myAssets\MyAppName.lnk') .copy('${Platform.environment['USERPROFILE']}\desktop\MyAppName.lnk'); } } catch (e) { //log } } void main() { runApp(MyApp()); _moveLnkFileToDesktop(); } ``` -------------------------------- ### Configure startup_task in msix_config Source: https://github.com/yehudakremer/msix/blob/main/doc/startup_task_configuration.md Use the startup_task field within msix_config to define the task ID, enable the task, and specify parameters passed to the application on startup. ```yaml msix_config: display_name: Flutter App startup_task: # <-- Startup Task task_id: my_flutter_app # optional (default: derived from app name) enabled: true # optional (default: true) parameters: autostart some_value # optional (default: null) msix_version: 1.0.3.0 ``` -------------------------------- ### MSIX Context Menu Configuration Structure Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md The configuration requires a dll_path and a list of items, where each item defines a type and its associated commands. Each command must have a unique ID and a corresponding CLSID. ```yaml msix_config: context_menu: dll_path: path/to/your/context_menu.dll # required items: ┐ - type: "*" │ commands: │ ┐ │ Item - id: Command4 │ Command │ One clsid: replace-with-your-guid-CDB3EAED7499 │ One │ custom_dll: path/to/your/custom/dll.dll │ │ ┘ │ ┘ ┐ - type: Directory │ commands: │ ┐ │ Item - id: Command1 │ Command │ Two clsid: replace-with-your-guid-CDB3EAED7496 │ One │ ┘ │ ┘ ┐ - type: Directory\Background │ commands: │ ┐ │ Item - id: Command1 │ Command │ Three clsid: replace-with-your-guid-CDB3EAED7496 │ One │ ┘ │ ┘ ┐ - type: .txt │ commands: │ ┐ │ - id: Command1 │ Command │ clsid: replace-with-your-guid-CDB3EAED7496 │ One │ ┘ │ ┐ │ Item - id: Command2 │ Command │ Four clsid: replace-with-your-guid-CDB3EAED4497 │ Two │ ┘ │ ┐ │ - id: Command3 │ Command │ Three clsid: replace-with-your-guid-CDB3EAED8498 │ One │ ┘ │ ┘ ``` -------------------------------- ### Unpack MSIX files Source: https://github.com/yehudakremer/msix/blob/main/README.md Run this command to generate the unpackaged MSIX files in the build folder for manual editing. ```console dart run msix:build ``` -------------------------------- ### Create Source.def Module Definition File Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md Create a file named Source.def in the same directory as dllmain.cpp to define exported DLL functions. ```cpp LIBRARY EXPORTS DllCanUnloadNow PRIVATE DllGetClassObject PRIVATE DllGetActivationFactory PRIVATE ``` -------------------------------- ### MSIX Configuration with Custom Certificate Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Configuring the package to use a specific .pfx certificate file and password. ```yaml msix_config: display_name: Flutter App msix_version: 1.0.0.0 certificate_path: C:\path\to\myCertificate.pfx certificate_password: 1234 ``` -------------------------------- ### Configure msix_config capabilities Source: https://github.com/yehudakremer/msix/wiki/How-To-Install-WebView2-Runtime-With-Msix-Flutter Add the necessary WebView capabilities to your msix configuration. ```yaml msix_config: assets_directory_path: 'C:\Users\me\Desktop\flutter_again\myAssets' capabilities: 'internetClient, internetClientServer, privateNetworkClientServer, enterpriseAuthentication, sharedUserCertificates, enterpriseCloudSSO, location, microphone, webcam' ``` -------------------------------- ### Handle startup arguments in Flutter Source: https://github.com/yehudakremer/msix/blob/main/doc/startup_task_configuration.md Access the parameters passed from the startup task via the main function's args list in a Flutter application. ```dart void main(List args) { // args: ['autostart', 'some_value'] runApp(MyApp(args)); } class MyApp extends StatelessWidget { final List args; const MyApp(this.args, {super.key}); //args... ``` -------------------------------- ### Configure Module Definition File Property Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md Set the Module Definition File property in Visual Studio project settings to Source.def. ```text Source.def ``` -------------------------------- ### SignTool Configuration by .pfx File Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Configures SignTool options using a .pfx certificate file path and password. ```yaml msix_config: display_name: Flutter App msix_version: 1.0.0.0 signtool_options: /fd SHA256 /f "\test_certificate.pfx" /p 1234 ``` -------------------------------- ### MSIX Configuration with Metadata Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Includes additional metadata such as supported languages and application capabilities. ```yaml msix_config: display_name: Flutter App publisher_display_name: Company Name identity_name: company.suite.flutterapp msix_version: 1.0.0.0 languages: en-us, de-de capabilities: "internetClient,location,microphone,webcam" ``` -------------------------------- ### Set Additional Dependencies Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md Add WindowsApp.lib to the Additional Dependencies section in the project properties. ```text WindowsApp.lib;%(AdditionalDependencies) ``` -------------------------------- ### Context Menu Structure Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md The basic structure for the context menu configuration block. ```yaml msix_config: context_menu: dll_path: path/to/your/context_menu.dll # required items: # required ... ``` -------------------------------- ### SignTool Configuration by .crt File Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Configures SignTool options using a .crt certificate file path. ```yaml msix_config: display_name: Flutter App msix_version: 1.0.0.0 signtool_options: /fd SHA256 /f "\test_certificate.crt" ``` -------------------------------- ### Configure msix_config assets_directory_path Source: https://github.com/yehudakremer/msix/wiki/How-To-Install-WebView2-Runtime-With-Msix-Flutter Update your msix configuration to include the path to your assets directory. ```yaml msix_config: assets_directory_path: 'C:\Users\me\Desktop\flutter_again\myAssets' ``` -------------------------------- ### MSIX Configuration for Windows Store Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Configuration required for publishing to the Windows Store, including publisher details and identity name. ```yaml msix_config: display_name: Flutter App publisher_display_name: Company Name identity_name: 48434MySoftware.MyFlutterApp publisher: CN=BF212345-5644-46DF-8668-012044C1B138 msix_version: 1.0.1.0 store: true ``` -------------------------------- ### MSIX Configuration Without Signing Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Disables MSIX signing, requiring only the publisher field. ```yaml msix_config: publisher: CN=PublisherName, O=Msix Testing... # required sign_msix: false ``` -------------------------------- ### SignTool Configuration by Thumbprint Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Configures SignTool options using the certificate SHA1 thumbprint. ```yaml msix_config: display_name: Flutter App msix_version: 1.0.0.0 signtool_options: /fd sha256 /sha1 028bc9922d198ee83d776aa19cb8e82897691e0c /tr http://timestamp.digicert.com ``` -------------------------------- ### SignTool Configuration by Subject Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Configures SignTool options using the certificate subject name. ```yaml msix_config: display_name: Flutter App msix_version: 1.0.0.0 signtool_options: /v /debug /sm /fd sha256 /n "Msix Testing" /tr http://timestamp.digicert.com ``` -------------------------------- ### Configure Context Menu in pubspec.yaml Source: https://github.com/yehudakremer/msix/blob/main/doc/context_menu_configuration.md Define the context menu structure and DLL path within the msix_config section of your Flutter project's pubspec.yaml file. ```yaml msix_config: context_menu: dll_path: path/to/your/context_menu.dll items: - type: "*" commands: - id: YourAppMenuCommand clsid: change-that-withyour-uniqueguid - type: Directory commands: - id: YourAppMenuCommand clsid: change-that-withyour-uniqueguid ``` -------------------------------- ### SignTool Configuration by Issuer Source: https://github.com/yehudakremer/msix/blob/main/example/README.md Configures SignTool options using the certificate issuer name. ```yaml msix_config: display_name: Flutter App msix_version: 1.0.0.0 signtool_options: /fd sha256 /i "Msix Testing" /tr http://timestamp.digicert.com ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.