C# Microsoft.Office.Interop.Word“;无法激活应用程序“;

C# Microsoft.Office.Interop.Word“;无法激活应用程序“;,c#,vsto,office-interop,C#,Vsto,Office Interop,当一些用户试图通过office interop从我们的应用程序启动Word时,我们遇到了一个问题: using Word = Microsoft.Office.Interop.Word; public void ShowWord() { _word = new Word.ApplicationClass(); _word.Visible = true; _word.Activate(); } 如果word不总是打开,则会抛出一个COM异常,说明“无法激活应用程序”。在调用之前添加

当一些用户试图通过office interop从我们的应用程序启动Word时,我们遇到了一个问题:

using Word = Microsoft.Office.Interop.Word;

public void ShowWord()
{
  _word = new Word.ApplicationClass();
  _word.Visible = true;
  _word.Activate();
}
如果word不总是打开,则会抛出一个COM异常,说明“无法激活应用程序”。在调用
之前添加
线程。Sleep(1000)
\u word.activate()
可防止出现这种情况,但显然这并不理想

public void ShowWord()
{
  _word = new Word.ApplicationClass();
  _word.Visible = true;
  Thread.Sleep(1000)
  _word.Activate();
}

以前有没有人见过这种情况,并且知道是什么导致了这种情况,以及解决这种情况的正确方法是什么?

您的应用程序是否具有激活Word COM对象的权限

检查本地激活安全要求是什么


但是,不确定为什么您的
线程.Sleep(1000)
会允许它工作?

我们遇到了类似的问题,Word似乎正在异步等待操作系统显示其窗口。解决此问题的方法是等待Visible属性返回true:

public void ShowWord()
{
  _word = new Word.Application();
  _word.Visible = true;

  System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
  while (!_word.Visible && sw.ElapsedMilliseconds < 10000)
  { /* Just Wait!! (at most 10s) */}
  _word.Activate();
}
public void ShowWord()
{
_word=新单词。应用程序();
_可见=真实;
System.Diagnostics.Stopwatch sw=System.Diagnostics.Stopwatch.StartNew();
而(!\u word.Visible和&sw.elapsedmillyses<10000)
{/*请稍等!!(最多10秒)*/}
_word.Activate();
}

希望这对其他人有所帮助。

来自MSDN:ApplicationClass类支持.NET Framework基础结构,不打算直接从代码中使用。它可能被证明与你的问题无关,但是你应该停止使用它。改用
Application
。是的,我也被
ApplicationClass
的这种用法弄糊涂了。这是一段相当古老的代码;我将查看
应用程序
,看看这是否解决了问题。我已将所有内容更改为
应用程序
,但没有任何区别。相关:是的,这不是权限问题。这与对象在内部初始化需要时间有关。所以我希望
new
是同步的。但它似乎是asynchronous.AFAIK,通过互操作对COM的调用被序列化为单个线程,这会使异步行为有点奇怪。事件日志中是否写入了任何内容?没有,事件日志中没有任何内容。我只能认为Thread.Sleep(1000)正如您所说,允许上下文切换回COM互操作线程,该线程在返回调用线程的激活调用之前完成初始化。如果您调试线程窗口中看到的是什么?问题就出在这里,我们无法在开发机器上重现这个问题;它只出现在我们的几台笔记本电脑上。我们已经从这些笔记本电脑中制作了一个虚拟机,并在开发人员的机器上运行,但我不知道如何连接到该进程。没有像多年前那样进行测试,但我会接受,因为这听起来很有道理:)