<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【UAP】使用 .NET Core App 編寫 UAP

      眾所周知,2024年9月微軟正式宣布了 .NET Core App 的 UWP 支持,至此我們終于可以在新版 csproj 用 .NET 8 及以上編寫 UWP 了,那么我們可不可以通過修改清單的方式來讓 UWP 變成 UAP 呢?

      UWP 和 UAP 使用的是同一套 WinRT API ,Windows 區分 UAP 和 UWP 的方式是看清單,只要是用 UAP 的清單就會仿真成 Win8.1 模式,于是我們只需要將清單變成 UAP 的樣子就行了。所以首先我們新建一個 .NET 9 Native AOT 的 UWP 項目

      然后我們修改清單,Win8 App 清單如下,內容按需填寫,Win8.1 App 的清單可以通過在 Github 搜索OSMaxVersionTested language:XML找到,6.2是 Win8,6.3是 Win8.1 ($targetentrypoint$需配合 ApplicationEntryPoint使用)

      <?xml version="1.0" encoding="utf-8"?>
      
      <Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
      
        <Identity
          Name="wherewhere.CoreAppUAP"
          Publisher="CN=where"
          Version="0.0.1.0" />
      
        <Properties>
          <DisplayName>CoreAppUAP</DisplayName>
          <PublisherDisplayName>wherewhere</PublisherDisplayName>
          <Logo>Assets\StoreLogo.png</Logo>
        </Properties>
      
        <Prerequisites>
          <OSMinVersion>6.2.0</OSMinVersion>
          <OSMaxVersionTested>6.3.0</OSMaxVersionTested>
        </Prerequisites>
      
        <Resources>
          <Resource Language="x-generate"/>
        </Resources>
      
        <Applications>
          <Application Id="App"
            Executable="$targetnametoken$.exe"
            EntryPoint="$targetentrypoint$">
            <VisualElements
              DisplayName="CoreAppUAP"
              Logo="Assets\MediumTile.png"
              SmallLogo="Assets\AppIcon.png"
              Description="CoreAppUAP"
              ForegroundText="light"
              BackgroundColor="transparent">
              <DefaultTile WideLogo="Assets\WideTile.png"/>
              <SplashScreen Image="Assets\SplashScreen.png"/>
              <InitialRotationPreference>
                <Rotation Preference="landscape"/>
                <Rotation Preference="portrait"/>
                <Rotation Preference="landscapeFlipped"/>
                <Rotation Preference="portraitFlipped"/>
              </InitialRotationPreference>
              <LockScreen Notification="badgeAndTileText" BadgeLogo="Assets\BadgeLogo.png"/>
            </VisualElements>
          </Application>
        </Applications>
      
        <Capabilities>
          <Capability Name="internetClient" />
        </Capabilities>
      </Package>

      然后我們在csproj中添加以下內容來取消引用VC++TargetDeviceFamily

      <PropertyGroup>
        <AddMicrosoftVCLibsSDKReference>False</AddMicrosoftVCLibsSDKReference>
        <EnableAppxWindowsUniversalTargetDeviceFamilyItem>False</EnableAppxWindowsUniversalTargetDeviceFamilyItem>
      </PropertyGroup>

      不過刪除了這些引用仍然會在清單生成Dependencies標簽,如果Dependencies是空的注冊時會報錯,所以我們需要添加任務來刪除清單中的Dependencies元素

      <UsingTask
        TaskName="RemoveDependencies"
        TaskFactory="CodeTaskFactory"
        AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
        <ParameterGroup>
          <AppxManifestPath ParameterType="System.String" Required="true" />
        </ParameterGroup>
        <Task>
          <Reference Include="System.Xml" />
          <Reference Include="System.Xml.Linq" />
          <Using Namespace="System.Linq" />
          <Using Namespace="System.Xml.Linq" />
          <Code Type="Fragment" Language="cs">
            <![CDATA[
                try
                {
                    var xdoc = XDocument.Load(AppxManifestPath);
                    var ns = xdoc.Root.Name.Namespace;
                    var dependencies = xdoc.Root.Descendants(ns + "Dependencies");
                    if (dependencies != null)
                    {
                        foreach (var node in dependencies.ToArray())
                        {
                            if (!node.HasElements)
                            {
                                node.Remove();
                            }
                        }
                    }
                    xdoc.Save(AppxManifestPath);
                }
                catch
                {
                    Log.LogError("Failed to load Appx Manifest.");
                    _Success = false;
                }
            ]]>
          </Code>
        </Task>
      </UsingTask>
      
      <Target
        Name="RemoveDependencies"
        AfterTargets="AfterGenerateAppxManifest">
        <Message Importance="high" Text="RemoveDependencies" />
        <RemoveDependencies AppxManifestPath="%(FinalAppxManifest.Identity)" />
      </Target>

      由于 XAML 編譯器編譯App.xaml時生成的入口點會使用DispatcherQueueSynchronizationContext來注冊線程上下文,這是16299才加入的 API,UAP 在獲取DispatcherQueue時會返回null,所以我們需要手動生成入口點和注冊線程上下文

      首先我們需要添加DISABLE_XAML_GENERATED_MAIN來注釋自動生成的入口點

      <DefineConstants>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN</DefineConstants>

      然后手動編寫程序入口點

      public static class Program
      {
          public static void Main(string[] args) => Application.Start(static p => _ = new App());
      }

      接著我們需要手動創建一個使用CoreDispatcher的線程上下文

      /// <summary>
      /// Provides a synchronization context for <see cref="CoreDispatcher"/>.
      /// </summary>
      /// <param name="dispatcher">The <see cref="CoreDispatcher"/> to associate this <see cref="CoreDispatcherSynchronizationContext"/> with.</param>
      public sealed class CoreDispatcherSynchronizationContext(CoreDispatcher dispatcher) : SynchronizationContext
      {
          /// <inheritdoc />
          public override void Post(SendOrPostCallback d, object? state)
          {
              ArgumentNullException.ThrowIfNull(d);
              _ = dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => d.Invoke(state));
          }
      
          /// <inheritdoc />
          public override SynchronizationContext CreateCopy() => new CoreDispatcherSynchronizationContext(dispatcher);
      
          /// <inheritdoc />
          public override void Send(SendOrPostCallback d, object? state) => throw new NotSupportedException("'SynchronizationContext.Send' is not supported.");
      }

      并在合適的時間注冊線程上下文,比如OnWindowCreated

      protected override void OnWindowCreated(WindowCreatedEventArgs e)
      {
          if (SynchronizationContext.Current == null)
          {
              CoreDispatcherSynchronizationContext context = new(e.Window.Dispatcher);
              SynchronizationContext.SetSynchronizationContext(context);
          }
          base.OnWindowCreated(e);
      }

      然后就可以點運行運行了

      經測試,熱重載等調試功能正常,UAP 可以調用一些與 UI 無關的新 WinRT API,甚至可以擴展標題欄,不過打包后無法成功在 Win8.1 安裝,原因未知

      最后附上示例應用:https://github.com/wherewhere/CoreAppUAP

      posted @ 2025-03-13 18:44  where-where  閱讀(238)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲熟女综合色一区二区三区| 彰化县| 三级4级全黄60分钟| 亚洲一区二区三午夜福利| 亚洲精品久荜中文字幕| 国产精品一区二区小视频| 亚洲春色在线视频| 99精品国产丝袜在线拍国语| 精品国产美女av久久久久| 亚洲精品国男人在线视频| 久久av高潮av喷水av无码| 国产午夜福利小视频在线| 国产精品不卡区一区二| 盖州市| 成人免费无码大片a毛片| 污污污污污污WWW网站免费| 大地资源免费视频观看| 国产成人精品亚洲日本片| 国产无套乱子伦精彩是白视频| 欧美和黑人xxxx猛交视频| 成人无码一区二区三区网站| 乱人伦中文字幕成人网站在线| 久久午夜无码免费| 国产激情国产精品久久源| 国产精品亚洲mnbav网站| 国产精品综合av一区二区| 久在线精品视频线观看| 免费现黄频在线观看国产| 日本视频一区二区三区1| 色橹橹欧美在线观看视频高清| 婷婷色综合成人成人网小说 | 久热久热久热久热久热久热| 色欲av亚洲一区无码少妇| 日韩在线视频一区二区三区| 国产另类ts人妖一区二区| 沧州市| 99在线小视频| 亚洲国产成人久久一区久久| 久久精品午夜视频| 亚洲精品动漫一区二区三| 欧洲精品码一区二区三区|