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

Citrix Microsoft.Web.WebView2/.NET Framework 4.8 WinForms应用程序+;已发布的应用程序运行时错误(REGDB_E_CLASSNOTREG),citrix,webview2,xenapp,Citrix,Webview2,Xenapp,我们使用的是XenApp:7.6。我们在Citrix Receiver中发布了一个.NET完整框架4.8 WinForms应用程序。此发布的应用程序托管在Windows Server 2008 R2 SP1(64位)计算机上。我们的应用程序使用Microsoft.Web.WebView2(1.0.824-prerelease)Web浏览器Winforms控件在应用程序中提供嵌入式Web浏览器 当我们的应用程序作为常规桌面应用程序在用于交付已发布应用程序的同一台Windows Server 200

我们使用的是XenApp:7.6。我们在Citrix Receiver中发布了一个.NET完整框架4.8 WinForms应用程序。此发布的应用程序托管在Windows Server 2008 R2 SP1(64位)计算机上。我们的应用程序使用Microsoft.Web.WebView2(1.0.824-prerelease)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:\ProgramFiles(x86)\Microsoft\EdgeWebView\Application\89.0.774.54\msedgewebview2.exe”--嵌入式浏览器webview=1--user data dir=“C:\Users\Admin\AppData\Roaming\OurAppName\EBWebView“--无默认浏览器检查--禁用具有背景页的组件扩展--无首次运行--禁用默认应用--无错误对话框--嵌入式浏览器webview dpi感知=0--禁用功能=msEdgeOnRampFRE、msEdgeOnRampImport、msEdgeMGPFrev1、msEdgeSettingsImport、msEdgeSettingsImportV2、msReadOutloude、msSyncEdgeCollections、msApplicationGuard、,msEdgeTranslate、msEdgeReadingView、WebPayments、msSendClientDataHeader、msSendClientDataHeaderToEdgeServices、msImplicitSignin、SpareRendererForSitePerProcess--禁用弹出窗口阻止--启用功能=ForwardMemoryPressureEventsTogprupAccess--internet explorer集成=无--js标志=“--协调弱引用和清理部分--暴露gc”--winhttp代理解析器--mojo命名平台通道管道=26740.36688.8089883041949745853

我尝试过的事情

  • 我已经使用ProcMon识别了作为已发布的Citrix应用程序启动应用程序时加载的所有CLSID,并验证了所有32位和64位CLSID是否存在。我还尝试在System32和SysWOW64文件夹中使用RegSvr32重新注册一些DLL
  • 我已经使用ProcMon来识别正在加载的所有依赖项,并验证这些依赖项是否存在。我结合使用ProcMon和dependency walker来验证是否存在所有DLL
  • 我已通过“dcomcnfg”和“mmc comexp.msc/32”验证所有COM权限是否正确
  • 尝试了此处的所有步骤(Diasymreader.dll CLASSNOTREG)
  • 尝试安装多个windows更新,包括2018年8月安全和质量汇总-运行已发布应用程序的windows Server 2008 R2 SP1(64位)操作系统显示为最新
  • 尝试在端点/客户端计算机上使用不同的屏幕分辨率和颜色深度
  • 尝试为服务器上的可执行文件设置各种兼容模式,禁用高DPI、直接合成等
  • 尝试了禁用调试标志的x64和x86版本生成-无PDB
  • 添加了检查以确保我们的应用程序在提升的管理员上下文中运行
  • 试图在app.config配置/启动元素中使用useLegacyV2RuntimeActivationPolicy=“true”
  • 在app.config元素中尝试运行时/loadFromRemoteSources元素
  • 安全应用程序。存在清单以与UAC正常工作
  • 已检查服务器上的本地安全策略(我看不到任何明显的问题)
  • 尝试嵌入式WebView2运行时(x64和x86)
  • 尝试从(x86和x64版本)安装和下载专用WebView2运行时
  • 在运行已发布应用程序的服务器上安装了最新版本的Edge
  • 将msedge.exe、msedge WebView2.exe、msedge WebView2添加到以下每个注册表项以禁用Citrix挂钩。。。
    • HKEY\U LOCAL\U MACHINE\SOFTWARE\Citrix\CtxHook\ExcludeDimagenes
    • HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Citrix\CtxHook64\ExcludeDimagenes
    • HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\services\CtxUvi\UVIProcess
关键差异

当通过Citrix Receiver portal以已发布应用程序的形式启动我们的应用程序时,与常规桌面应用程序相比,我们通过ProcMon看到了以下主要区别

  • 我们在注册表中看到用于定位以下CLSID的调用(通过常规桌面应用程序启动时,我们看不到这些调用)。。。
    • 60A417CA-F1AB-4307-801B-F96003F8938B-主机对象辅助对象
    • 9BA05972-F6A8-11CF-A442-00A0C90A8F39-外壳文件夹视图路由器
    • 0A29FF9E-7F9C-4437-8B11-F424491E3931-NDP SymBinder CorSymBinder_SxS/Dia-based符号读取器(diasymreader.dl/mscoree.dll)l
    • FAE3D380-FEA4-4623-8C75-C6B61110B681\实例-WindowsCodecs.dll
      • 0E25DC18-9F5E-48B1-80B3-D124E81B773B颜色转换器(%SystemRoot%\system32\windowscodecsext.dll)
      • 05AF94D8-7174-4CD2-BE4A-4124B80EE4B8
      • 7835EAE8-BF14-49D1-93CE-533A407B2248
      • 7ED96837-96F0-4812-B211-F13C2411ED3
      • ABE3B9A4-257D-4B97-BD1A-294AF496222E
      • AC757296-3522-4E11-9862-C17BE5A1767E
  • 我已经验证了上述CLSID中引用的DLL