使用 MSIX 安装程序的 WPF 桌面应用程序 - 未找到目录

Posted

技术标签:

【中文标题】使用 MSIX 安装程序的 WPF 桌面应用程序 - 未找到目录【英文标题】:WPF Desktop App using MSIX installer - Directory Not Found 【发布时间】:2022-01-16 10:30:22 【问题描述】:

我正在与客户合作使用 Blazor Desktop 部署 WPF 应用程序。我们有一些应用程序运行所需的资源。我将它们指定在一个项目组中,如下所示:

  <ItemGroup>
    <Content Update="wwwroot\**">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

直接在调试模式下运行 WPF 时它工作正常,但如果我通过我的 MSIX 安装程序运行,我会得到一个找不到目录的异常,因为它正在 C:\Windows\System32 中查找包含这些资源的文件夹。我觉得我在 appxmanifest 中遗漏了一些东西,如下所示

<?xml version="1.0" encoding="utf-8"?>

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap rescap">

  <Identity
    Name="0f515ea1-7f17-43cd-949f-2ddde5e8176a"
    Publisher="CN=SampleCo"
    Version="1.0.0.0" />

  <Properties>
    <DisplayName>CompanyPortal.Installer</DisplayName>
    <PublisherDisplayName>SampleCo</PublisherDisplayName>
    <Logo>Images\StoreLogo.png</Logo>
  </Properties>

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
  </Dependencies>

  <Resources>
    <Resource Language="x-generate"/>
  </Resources>

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="$targetentrypoint$">
      <uap:VisualElements
        DisplayName="My App"
        BackgroundColor="transparent"
        Square150x150Logo="Images\Square150x150Logo.png"
        Square44x44Logo="Images\Square44x44Logo.png" Description="Admin Portal for the TallyIO System">
        <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
        <uap:SplashScreen Image="Images\SplashScreen.png" />
      </uap:VisualElements>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
  </Capabilities>
</Package>

这也是我的 msix 项目的 csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'">
    <VisualStudioVersion>15.0</VisualStudioVersion>
  </PropertyGroup>
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|x86">
      <Configuration>Debug</Configuration>
      <Platform>x86</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x86">
      <Configuration>Release</Configuration>
      <Platform>x86</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|ARM">
      <Configuration>Debug</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM">
      <Configuration>Release</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|ARM64">
      <Configuration>Debug</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM64">
      <Configuration>Release</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|AnyCPU">
      <Configuration>Debug</Configuration>
      <Platform>AnyCPU</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|AnyCPU">
      <Configuration>Release</Configuration>
      <Platform>AnyCPU</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup>
    <WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
  </PropertyGroup>
  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
  <PropertyGroup>
    <ProjectGuid>0d34caa9-b40d-4e58-9045-11d2bcfb4e9d</ProjectGuid>
    <TargetPlatformVersion>10.0.22000.0</TargetPlatformVersion>
    <TargetPlatformMinVersion>10.0.14393.0</TargetPlatformMinVersion>
    <DefaultLanguage>en-US</DefaultLanguage>
    <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
    <NoWarn>$(NoWarn);NU1702</NoWarn>
    <EntryPointProjectUniqueName>..\CompanyPortal.Desktop\CompanyPortal.Desktop.csproj</EntryPointProjectUniqueName>
    <PackageCertificateThumbprint>66AD090A86AB81268A60B29B3FE0455B5E09446A</PackageCertificateThumbprint>
    <PackageCertificateKeyFile>CompanyPortal.Installer_TemporaryKey.pfx</PackageCertificateKeyFile>
  </PropertyGroup>
  <ItemGroup>
    <AppxManifest Include="Package.appxmanifest">
      <SubType>Designer</SubType>
    </AppxManifest>
  </ItemGroup>
  <ItemGroup>
    <None Include="CompanyPortal.Installer_TemporaryKey.pfx" />
    <Content Include="Images\SplashScreen.scale-200.png" />
    <Content Include="Images\LockScreenLogo.scale-200.png" />
    <Content Include="Images\Square150x150Logo.scale-200.png" />
    <Content Include="Images\Square44x44Logo.scale-200.png" />
    <Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
    <Content Include="Images\StoreLogo.png" />
    <Content Include="Images\Wide310x150Logo.scale-200.png" />
  </ItemGroup>
  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22000.194" PrivateAssets="all" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\CompanyPortal.Desktop\CompanyPortal.Desktop.csproj" />
  </ItemGroup>
</Project>

我是否缺少某些东西,或者是否可以使用 MSIX 部署 Blazor 桌面应用程序?

谢谢,

【问题讨论】:

Blazor 在这里的具体作用是什么?你如何启动/使用它? 客户端在 Web 视图中使用 Blazor 作为桌面应用程序的一部分。它找不到的文件是 wwwroot 目录。它在应用程序目录中,但它试图在 C:\Windows\System32 目录中找到它们 【参考方案1】:

我怀疑这是因为该文件夹在打包到 MSIX 中时没有被操作系统虚拟化。

正如我在this article 中解释的那样,MSIX 容器仅虚拟化了某些系统文件夹列表,Microsoft 提供的列表包含在文章中。

任何其他文件夹必须在首次启动时从安装位置复制到实际位置,或者(如果您需要只读访问权限)您使用 PSF 重定向 API 调用并从您的安装路径提供它。

我给你的推荐:

启动 CMD inside the MSIX container context 并在安装文件夹 (ProgramFiles\WindowsApps\yourapp) 上运行目录,以查看文件是否实际安装在计算机上 如果它们在那里,请将它们手动复制到 IIS wwwroot 文件夹中,然后再次尝试运行应用程序。如果可行,则意味着您需要在首次启动应用时自动执行此副本。

如果没有,那么您需要使用PSF to redirect API calls(只读)从安装位置(WindowsApps 文件夹)加载资源。

【讨论】:

@ryancondron:你在使用 IIS 吗? 不,这是在 WPF 容器中使用 Blazor wasm Web 程序集

以上是关于使用 MSIX 安装程序的 WPF 桌面应用程序 - 未找到目录的主要内容,如果未能解决你的问题,请参考以下文章

MSIX 未打包所有依赖项

MSIX 默认安装到 AppData,而不是 ProgramFiles

无法从 MSIX 打包应用程序加载外部 DLL

用于 Azure 迁移的 MSIX Windows 10 应用程序访问被拒绝后 SSO 登录

MSIX 侧载应用在更新后启动缓慢

使用 MSIX 打包的 WPF 无法通过 Microsoft Store 验证