WPF打印(XpsDocumentWriter)在调试但不在部署中工作

时间:2016-02-10 13:44:36

标签: c# wpf printing

希望一些经验丰富的WPF开发人员之前遇到过这个问题。

背景信息:此信息可能不是帮助解决问题所必需的,但如果相关的话。 我的解决方案包括三个项目。前端GUI,业务逻辑服务和打印机服务。这三个项目通过命名管道进行IPC。业务逻辑将打印逻辑交给标签类型和托盘ID。

问题:打印逻辑然后创建标签并将其打印出来(通过将其添加到打印机的打印队列中)正如标题所示,当我在visual studio中调试时,一切正常。但是,当我在我的开发人员电脑上部署/安装服务 时,它无法正常工作。

更新:它不会抛出异常但我只记录"即将发送文档到打印机"而不是行"发送文档到打印机"所以它挂在dw1.Write(fixedDoc);

更多信息:我在打印项目/ visual studio 2013中使用.Net 4.0

        public void printLabel(string labelType, string _palletID = null)
    {
        try
        {
            ILabelTemplate Label                = createLabel(labelType, _palletID);

            PrintDialog pd                      = new PrintDialog();
            FixedDocument fixedDoc              = new FixedDocument();
            PageContent pageContent             = new PageContent();

            FixedPage fixedPage                 = getFixedPage();
            fixedDoc.DocumentPaginator.PageSize = new System.Windows.Size(fixedPage.Width, fixedPage.Height);

            IXamlTemplate vm                    = CreateViewModel(Label);
            ILabelPrintDocument template        = CreateTemplate(Label);

            template.dockPanel.DataContext      = vm;
            template.dockPanel.Height           = fixedPage.Height;
            template.dockPanel.Width            = fixedPage.Width;
            template.dockPanel.UpdateLayout();


            fixedPage.Children.Add(template.dockPanel);
            ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage);
            fixedDoc.Pages.Add(pageContent);

            XpsDocumentWriter dw1 = PrintQueue.CreateXpsDocumentWriter(new System.Printing.PrintQueue(new System.Printing.PrintServer(), Label.PrinterName));
            Library.WriteErrorLog("About to send doc to printer");
            dw1.Write(fixedDoc);
            Library.WriteErrorLog("Sent doc to printer");


        }
        catch (Exception ex)
        {

            Library.WriteErrorLog(ex);
        }

1 个答案:

答案 0 :(得分:0)

已解决 ......有点

经过几个小时尝试不同的事情并阅读此内容后,我发现这是因为我的应用程序在我调试时作为我运行,但在部署时作为本地系统运行。并且本地系统服务无法访问打印机等网络资源。尽管如此,我还是开始了如何制作C#服务打印的道路。看到很多帖子后(在游戏中为时已晚,非常有帮助)

Like this以及this one我了解到我走错了路。

故事的寓意是,如果你正在阅读这篇文章,你可能不会“使用Win32 API编写自己的打印DLL(例如在C / C ++中)”,然后从你的文章中使用它使用P / Invoke服务“

对我有用的解决方案不是将此项目作为通过我的GUI启动的服务运行。我把它变成了一个仍然通过我的GUI启动和停止的过程。

有问题的代码是

                if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + "\\yourAppNameGoesHere.exe"))
            {
                Process.Start(AppDomain.CurrentDomain.BaseDirectory + "\\yourAppNameGoesHere.exe");
            }

然后当GUI关闭时我运行代码

        if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + "\\yourAppNameGoesHere.exe"))
        {
           Process[] myapps = Process.GetProcesses("yourAppNameGoesHere.exe");
           foreach (Process _p in myapps)
           {
               _p.Kill();
           }

        }