使用 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)' < '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 默认安装到 AppData,而不是 ProgramFiles