希望一些经验丰富的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);
}
答案 0 :(得分:0)
已解决 ......有点
经过几个小时尝试不同的事情并阅读此内容后,我发现这是因为我的应用程序在我调试时作为我运行,但在部署时作为本地系统运行。并且本地系统服务无法访问打印机等网络资源。尽管如此,我还是开始了如何制作C#服务打印的道路。看到很多帖子后(在游戏中为时已晚,非常有帮助)
故事的寓意是,如果你正在阅读这篇文章,你可能不会“使用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();
}
}