Microsoft.Web.WebView2 / .NET Framework 4.8 WinForms 应用程序 + 已发布应用程序运行时错误 (REGDB_E_CLASSNOTREG)

问题描述

我们使用的是 XenApp:7.6。我们有一个 .NET 完整框架 4.8 WinForms 应用程序作为 Citrix Receiver 中的已发布应用程序。此已发布的应用程序托管在 Windows Server 2008 R2 SP1(64 位)计算机上。我们的应用程序使用 Microsoft.Web.WebView2(1.0.824 预发行版)Web 浏览器 Winforms 控件在我们的应用程序中提供嵌入式 Web 浏览器。

我们的应用程序在用于交付已发布应用程序的同一 Windows Server 2008 R2 SP1 服务器上作为常规桌面应用程序运行时,没有任何问题。我们的应用程序在 Windows 10 和 Windows Server 2012 上作为常规桌面应用程序运行时也没有任何问题。

当我们通过 Citrix Receiver 作为已发布的应用程序启动我们的应用程序时,当 Microsoft.Web.WebView2 Winforms 控件尝试创建 webview2 环境时,我们会在运行时看到 REGDB_E_CLASSNOTREG 错误。您可以在下面看到运行时异常...

System.Runtime.InteropServices.COMException (0x80040154): Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode,IntPtr errorInfo)
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode)
at Microsoft.Web.WebView2.Core.CoreWebView2Environment.d__28.MoveNext()
--- End of stack trace from prevIoUs location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Web.WebView2.WinForms.WebView2.d__14.MoveNext()
--- End of stack trace from prevIoUs location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
The same application works without any issues when launched via the same Citrix Receiver portal using a Citrix published desktop and not a Citrix published application. 

在启动已发布应用程序时在服务器上使用 ProcMon 我可以看到我们的应用程序最终调用 C:\Program Files (x86)\Microsoft\EdgeWebView\Application\89.0.774.54\EBWebView\x64\EmbeddedbrowserWebView.dll我相信然后启动 msedgewebview2.exe 进程。我们可以看到 msedgewebview2.exe 可执行文件正在为已发布的应用程序成功启动。下面显示了传递给 msedgewebview2.exe 的命令参数...

C:\Program Files (x86)\Microsoft\EdgeWebView\Application\89.0.774.54\msedgewebview2.exe" --embedded-browser-webview=1 --user-data-dir="C:\Users\Admin\AppData\Roaming\OurAppName\EBWebView" --no-default-browser-check --disable-component-extensions-with-background-pages --no-first-run --disable-default-apps --noerrdialogs --embedded-browser-webview-dpi-awareness=0 --disable-features=msEdgeOnRampFRE,msEdgeOnRampImport,msEdgeMGPFrev1,msEdgeSettingsImport,msEdgeSettingsImportV2,msReadAloud,msSyncEdgeCollections,msApplicationGuard,msEdgeTranslate,msEdgeReadingView,WebPayments,msSendClientDataHeader,msSendClientDataHeaderToEdgeServices,msImplicitSignin,SpareRendererForSitePerProcess --disable-popup-blocking --enable-features=ForwardMemoryPressureEventsToGpuProcess --internet-explorer-integration=none --js-flags="--harmony-weak-refs-with-cleanup-some --expose-gc" --winhttp-proxy-resolver --mojo-named-platform-channel-pipe=26740.36688.8089883041949745853

我尝试过的东西

  • 在将我们的应用程序作为已发布的 Citrix 应用程序启动时,我使用 ProcMon 来识别加载的所有 CLSID,并验证了所有 32 位和 64 位 CLSID 都存在。我还尝试在 System32 和 SysWOW64 文件夹中使用 RegSvr32 重新注册许多 DLL
  • 我已经使用 ProcMon 来识别正在加载的所有依赖项并验证这些依赖项是否存在。我结合使用了 ProcMon 和 Dependency walker 来验证所有 DLL 都存在。
  • 我已通过“dcomcnfg”和“mmc comexp.msc /32”验证所有 COM 权限均正确
  • 尝试此处的所有步骤 https://support.microsoft.com/en-us/topic/-access-denied-errors-and-applications-with-com-activation-fail-after-installing-july-2018-security-and-quality-rollup-updates-for-net-framework-fd3d7a3f-ca2f-6e87-c409-a5652175cf40 (Diasymreader.dll CLASSNOTREG)
  • 尝试安装多个 Windows 更新,包括 2018 年 8 月的安全和质量汇总 - 运行已发​​布应用程序的 Windows Server 2008 R2 SP1(64 位)操作系统似乎是最新的。
  • 在端点/客户端机器上尝试了不同的屏幕分辨率、颜色深度
  • 尝试为我们在服务器上的可执行文件设置各种兼容模式,禁用高 DPI、直接合成等
  • 尝试禁用调试标志的 x64 和 x86 版本构建 - 没有 PDB
  • 添加了检查以确保我们的应用程序在提升的管理员上下文中运行
  • 尝试在 app.config 配置/启动元素中使用LegacyV2RuntimeActivationPolicy="true"
  • 在 app.config 元素中尝试了 runtime/loadFromremoteSources 元素
  • 确保应用。 manifest 存在以与 UAC 正常工作
  • 检查了服务器上的本地安全策略(我看不到任何明显的问题)
  • 尝试嵌入式 WebView2 运行时(x64 和 x86)
  • 尝试从 https://developer.microsoft.com/en-us/microsoft-edge/webview2/(x86 和 x64 版本)安装和下载专用的 WebView2 运行时
  • 在运行已发布应用程序的服务器上安装了最新版本的 Edge
  • 向以下每个注册表项添加了 msedge.exe、msedgewebview2.exe、msedgewebview2 以禁用 Citrix 挂钩...
    • HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\CtxHook\ExcludedImageNames
    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\CtxHook64\ExcludedImageNames
    • HKEY_LOCAL_MACHINE\SYstem\CurrentControlSet\services\CtxUvi\UviProcessExcludes

主要区别

当通过 Citrix Receiver 门户将我们的应用程序作为已发布的应用程序启动而不是常规桌面应用程序时,我们通过 ProcMon 看到以下主要区别...

  • 我们看到调用注册表以定位以下 CLSID(通过常规桌面应用程序启动时我们看不到这些调用)...
    • 60A417CA-F1AB-4307-801B-F96003F8938B - 主机对象助手
    • 9BA05972-F6A8-11CF-A442-00A0C90A8F39 - Shell 文件夹视图路由器
    • 0A29FF9E-7F9C-4437-8B11-F424491E3931 - NDP SymBinder CorSymBinder_SxS / 基于 Dia 的 SymReader (diasymreader.dl / mscoree.dll)l
    • FAE3D380-FEA4-4623-8C75-C6B61110B681\Instance - WindowsCodecs.dll
      • 0E25DC18-9F5E-48B1-80B3-D124E81B773B ColourTransformer (%systemRoot%\system32\windowscodecsext.dll)
      • 05AF94D8-7174-4CD2-BE4A-4124B80EE4B8
      • 7835EAE8-BF14-49D1-93CE-533A407B2248
      • 7ED96837-96F0-4812-B211-F13C24117ED3
      • ABE3B9A4-257D-4B97-BD1A-294AF496222E
      • AC757296-3522-4E11-9862-C17BE5A1767E
  • 我已验证上述 CLSID 中引用的 DLL 存在于 System32 和 SysWOW64 中
  • 我们看到 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\diasymreader.dll 中的 PDB 符号读取器正在加载。
  • 在访问任何文件之前,我们会看到调用了位于 HKU.Default\Software\Citrix\SessionSfr\10 的注册
  • 我们的应用程序在端点上的 WFICA32.EXE 进程下运行,该进程是一个 32 位进程。我们在服务器上看到我们的应用程序作为一个常规 64 位进程在属于本地管理员组的域用户下运行。

注意事项

  • 虽然我们拥有完整的管理员权限并且我们的 Winforms 应用程序在本地管理员的上下文中运行,但托管已发布应用程序的 Windows Server 2008 R2 SP1 服务器位于域中并且应用了各种组策略。
  • 在托管已发布应用程序的 Windows Server 2008 R2 SP1 服务器上完全禁用了 Windows 防火墙

在这个阶段,我不确定接下来要尝试什么。我真诚地欢迎社区内的 Citrix 专家提出任何建议。

预先感谢您提供的任何建议或帮助。

现在最好的祝福,

瑞恩

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)