![](/img/trans.png)
[英]Check MS Office license status via Office Automation or with other way
[英]Remoting Automation of MS Office on the server
我警告您,对于许多人来说,他的问题似乎很奇怪:)但是我必须发布该问题,因为我的项目经理认为我存在技术解决方案,即使对我而言也不存在。
我们有什么:
我的总理想要什么(我告诉他这是不可能的):
对我来说,这种“可以实现Office远程女士自动化”的解决方案似乎是不可能的。 但是也许我错了,可以使用DCOM,WCF或其他东西吗?
任何人都可以确认我是对的;)
正如您已经从注释中了解到的那样,由于某些原因,自动化任何Office应用程序的桌面版本都是很糟糕的。 有关详细信息,请参见知识库文章KB257757 Office的服务器端自动化注意事项 。 该文章的主要内容是:
Microsoft当前不建议也不支持任何无人参与的非交互客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT Services)中的Microsoft Office应用程序自动化,因为Office可能表现出不稳定的行为和/在此环境中运行Office时出现死锁或死锁。
但是,正如您仍然坚持认为的那样,请考虑以下示例,这是一个非常简单,幼稚的示例,不能在生产概念验证时使用,它使您可以快速解决知识库文章中提到的所有问题。
在全新的解决方案中,创建WCF服务应用程序和控制台应用程序。 在WCF应用程序中,添加以下接口:
[ServiceContract]
public interface IPrintService
{
[OperationContract]
string Print(Stream wordDoc);
}
并有一个服务来实现。 确保添加对Microsoft.Office.Interop.Word
的引用,您可以在“添加引用”对话框的“ COM”选项卡中找到该引用。
public class PrintService : IPrintService
{
public string Print(Stream wordDocStream)
{
// copy our stream to a local file
var tempFile = Path.GetTempFileName();
using(var file = File.Create(tempFile))
{
wordDocStream.CopyTo(file);
}
// start word
var wordApp = new Microsoft.Office.Interop.Word.Application();
// setup printer
wordApp.ActivePrinter = "Canon LBP3010/LBP3018/LBP3050";
// open, collect data, print and close
var doc = wordApp.Documents.Open(tempFile);
doc.PrintOut();
var res = doc.Words.Count;
doc.Close(false);
// quit word
wordApp.Quit(false);
// delete temp file
File.Delete(tempFile);
return String.Format("{0} words", res);
}
}
您可以在此处看到一个准系统解决方案,用于打印作为流发送到服务的文档。 该服务将流复制到文件,启动Word,打开文件,打印文档,从文档中获取一些数据,然后拆解并清理干净。
客户很直接:
using(var client = new PrintService.PrintServiceClient())
{
using(var file = File.Open(@"small.docx", FileMode.Open))
{
var response = client.Print(file);
Console.WriteLine(response);
}
}
从技术上讲,这就是从服务中打印Word文档所需要的全部。 这在开发服务器上运行没有很多问题。 如果您在IIS上运行此程序,则可能必须确保在AppPool中用作标识的帐户是可以启动Word的“用户”,允许其访问打印机等。我已经遇到一个已知问题:我使用XPS打印驱动程序,导致弹出对话框。 这是您在服务器上无法做到的,并且没有阻止或检测到这种情况的真正方法。
请记住,此服务接口仅允许发送流。 如果要添加额外的数据,则必须使用消息合同,如大数据和流媒体中的 msdn所述。 在这种情况下,您的合同必须如下所示:
[MessageContract]
public class UploadStreamMessage
{
[MessageHeader]
public string appRef;
[MessageBodyMember]
public Stream data;
}
如果运行所有这些(压力)测试,请考虑部署并安装。我敢肯定,您会说服任何人这不是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.