UWP 代理组件重启/停止 DLL
Posted
技术标签:
【中文标题】UWP 代理组件重启/停止 DLL【英文标题】:UWP Brokered Component Restart/Stop DLL 【发布时间】:2019-03-28 01:21:36 【问题描述】:所以我正在按照本指南 https://docs.microsoft.com/en-us/windows/uwp/winrt-components/brokered-windows-runtime-components-for-side-loaded-windows-store-apps#creating-and-deploying-the-windows-runtime-proxy 为我的 UWP 应用程序实现打印
我有一个打印机停止工作的错误,我意识到一个修复方法是进入任务管理器并删除与 dll 关联的 COM 代理。我不确定如何找出这是什么dll,以前有没有人遇到过这个问题?
我认为解决方法是以某种方式重新链接组件,但不确定如何。
【问题讨论】:
使用进程管理器发现 dll 来自 C:\WINDOWS\SYSWOW64 作为使用代理组件的替代方法,您可以为您的 UWP 使用桌面扩展。这是一个教程:stefanwick.com/2018/04/06/uwp-with-desktop-extension-part-1 这是一个使用这种技术进行打印的简单示例:1drv.ms/u/s!AovTwKUMywTNnOsbzlRfghOikDy8Dw 嗨 Stefan,此解决方案是否适用于侧载应用程序?此外,这是相同的实现还是替代实现docs.microsoft.com/en-us/windows/uwp/devices-sensors/…?此外,如果您对 kennyzx 关于杀死 dllhost.exe 的评论有任何意见,那就太棒了。 您提供的链接是正确的现代方式。尽管您不能进行静默/无人值守打印,但它有一个限制。我假设这就是您采用代理组件路线的原因。如果不是这种情况,那么无论如何你应该从现代 API 开始。回答您的问题:我的替代方案(允许静默打印)适用于侧载和商店分发。关于代理组件,我会说这是不积极鼓励/推荐的 Win8 技术。使用桌面扩展比代理组件更受欢迎。 很高兴知道 - 我不知道 - 再次感谢 Stefan 提供的信息和两个解决方案。 【参考方案1】:从 UWP 打印的正确方法是使用 Windows.Graphics.Printing、Windows.UI.Xaml.Printing、PrintDocument API,如下所述: https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/print-from-your-app
需要注意的是,这种方法目前不支持静默/无人值守打印场景。对于那些你必须使用经典 Win32 打印 API 的人,无论是从代理组件(如你所尝试的那样)还是使用 UWP 的桌面扩展。后者是首选路线(代理组件是 Win8 时代的技术)。我在这里有一个关于桌面扩展的快速教程:https://stefanwick.com/2018/04/06/uwp-with-desktop-extension-part-1/ 和一个非常简单的静默打印示例:1drv.ms/u/s!AovTwKUMywTNnOsbzlRfghOikDy8Dw
【讨论】:
【参考方案2】:我在 LOB 应用程序中使用这种技术(代理 Windows 运行时组件)已有好几年了,它始终是用于维护的 PITA。
每次我对Brokered Windows Runtime Component
进行更新时,我都需要使用 regsvr32.exe 重新注册它。如果我已经运行了应用程序并且 COM Surrogate 已经在运行,则注册将失败。我将需要重新启动系统,或者我必须在任务管理器中终止正在运行的“dllhost.exe” - 可能有多个dllhost.exe
实例,我只需终止在当前登录用户下运行的实例,然后离开那些以 SYSTEM 身份运行。
其中一个 dllhost.exe 实例承载您创建和注册的 DLL。目前尚不清楚为什么打印机停止工作,所以我无法给出答案。为了帮助调查,请在这些点添加一些日志。
当应用代码调用代理 Windows 运行时组件时,检查调用的返回值,并尝试捕获任何异常。
在代理的 Windows 运行时组件内部,在应用程序调用的方法的入口和出口处。
检查使用打印机的代码,它工作正常吗?还是根本没有调用它?
【讨论】:
实际上,我的调查使我得到了您所描述的内容。问题是使用 regsvr32.exe 重新注册,我在任务管理器中找到了相同的解决方案。您是否知道通过代码执行此操作的任何解决方案,或者这是不可能的? 尝试按名称查找 dllhost.exe 进程(“dllhost”,不包括扩展名),并列出每个进程已加载的模块(检查 Process.Modules 属性),如果您找到您的模块列表中的ProxyStub dll,然后杀死进程。 这个post 解释了 COM 代理的作用,我认为杀死它是安全的,不会产生严重的副作用,例如影响其他进程的功能。以上是关于UWP 代理组件重启/停止 DLL的主要内容,如果未能解决你的问题,请参考以下文章