UWP 打包 win32 應用 添加防火牆例外

  • 2020 年 2 月 18 日
  • 筆記

我想要將一個 WPF 應用打包為 UWP 應用,然後用我自己的商店發布,在做 UWP 安裝包的小夥伴會問如何和 nsis 一樣添加防火牆例外

應用沒有在安裝添加例外,會在應用開放服務監聽埠提示 Windows Defender 防火牆已組織所有共用網路和專用網路上的 xx 的某些功能,如果用戶沒有點擊允許訪問,那麼一些功能訪問可能會因為防火牆不讓用,用 nsis 添加防火牆例外建議是添加一個應用可以通過

我的 WPF 程式是 WPF 程式加上 asp dotnet core 程式,我這是將 asp dotnet core 作為客戶端使用,主要作用是 ipc 也就是進程通訊,用這個方法沒有什麼好處,下次有小夥伴要用,我推薦 dotnet-campus/dotnetCampus.IPC.WCF 一個基於WCF適用於C#項目進行IPC通訊的庫

在我的例子里,我用一個純 asp dotnet core 代替,請看 githubMainNarhedeachawhearWeargijawgowe 項目,這個項目是這樣創建的。先用 dotnet new webapi -o NarhedeachawhearWeargijawgowe 創建空白項目,然後打開 Program.cs 文件,添加下面程式碼

webBuilder.UseUrls("http://0.0.0.0:12307");

這樣就可以讓這個應用在電腦上開啟防火牆會提示用戶是否允許讓這個應用訪問

我推薦用 UWP 打包的 win32 程式都在另一個啟動器項目裡面運行,這樣就能做到我不需要改動原有的 win32 項目的程式碼,我可以給任意第一個win32應用打包上架到應用商店

方法是我創建一個 net461 的控制台項目,創建方法是通過 dotnet new console -o DalljalfonafearBairyekeregu 創建一個空白的控制台項目,然後打開 csproj 文件,更改下面程式碼

<Project Sdk="Microsoft.NET.Sdk">          <PropertyGroup>          <OutputType>WinExe</OutputType>          <TargetFramework>net461</TargetFramework>        </PropertyGroup>        <ItemGroup>          <None Include="..MainNarhedeachawhearWeargijawgowebinDebugnetcoreapp3.1****">              <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>          </None>      </ItemGroup>      </Project>

上面程式碼將 OutputType 修改為 WinExe 的作用是讓這個控制台項目不會顯示黑框,而 net461 的版本是為了在打包項目引用

用 net461 而不是 47 的原因是打包項目現在用的是 .NET Core 5 不能引用 47 而用 .NET Core 需要設置獨立部署這樣打包的應用很大

上面程式碼的 ItemGroup 的內容就是引用另一個應用的所有文件夾,這裡的 CopyToOutputDirectory 設置將所有文件輸出,這樣就能在打包時輸出應用

打開 DalljalfonafearBairyekeregu 也就是啟動器項目的 Program.cs 文件,給這個文件添加下面程式碼

        static void Main(string[] args)          {              var file = Path.Combine(Assembly.GetExecutingAssembly().Location, @"..NarhedeachawhearWeargijawgowe.exe");              Process.Start(file);          }

這樣就能調用實際的應用

關於啟動器程式碼請看 github 的 DalljalfonafearBairyekeregu 文件

這個項目的細節是 WinExe 和 net461 的設置,還有 Main 裡面記得調用原先的應用

創建打包項目 JadallhearfairBarwalbegear 這個項目需要右擊應用程式,添加啟動器的引用

如果是一個不需要添加防火牆例外的應用,這樣做就完成了

需要添加防火牆例外的需要右擊 Package.appxmanifest 查看程式碼,添加下面程式碼

    <Extensions>          <desktop2:Extension Category="windows.firewallRules">              <desktop2:FirewallRules Executable="DalljalfonafearBairyekereguNarhedeachawhearWeargijawgowe.exe">                  <desktop2:Rule Direction="in" IPProtocol="TCP" Profile="all"/>                  <desktop2:Rule Direction="in" IPProtocol="UDP"                                 Profile="all"/>                  <desktop2:Rule Direction="out"                                 IPProtocol="TCP"                                 Profile="all"/>                  <desktop2:Rule Direction="out"                                 IPProtocol="UDP"                                 Profile="all"/>              </desktop2:FirewallRules>          </desktop2:Extension>      </Extensions>

上面程式碼需要添加命名空間

  xmlns:desktop2="http://schemas.microsoft.com/appx/manifest/desktop/windows10/2"

詳細程式碼請看 github 的 JadallhearfairBarwalbegearPackage.appxmanifest 文件

上面程式碼的細節是需要放在 Extensions 裡面,而 Executable 的路徑是放在啟動器文件夾裡面,如果輸入的文件找不到在點擊發布提示沒有文件

添加防火牆規則建議添加 tcp 和 udp 和出站入站請看上面程式碼,通過 Profile 可以設置文件例外可以訪問埠

用上面方法可以給win32應用,不管這個應用是不是咱的,打包為 UWP 應用

打包為 UWP 應用可以用自己做的應用商店發布,自動更新

如何自己做一個 UWP 應用商店,請看 加強版在中國分發 UWP 應用正確方式 通過win32安裝UWP應用

如果你看程式碼不知道如何打包,我推薦你從github下載我的程式碼,用 VisualStudio 2019 打開,先使用 dotnet build 構建 MainNarhedeachawhearWeargijawgowe 程式碼

然後雙擊 Package.appxmanifest 點擊打包,創建一個你自己的證書,然後右擊 JadallhearfairBarwalbegear 項目發布,試試發布後的項目。如果成功那麼再將這個項目修改為你需要的項目

從法律上,更改非自己的應用然後發布是不合法的,但是在中國一堆盜版軟體,這個可以忽略,等你的應用商店做起來之後再找對應的公司討論

本作品採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含鏈接: https://blog.lindexi.com ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請 與我聯繫