C# Microsoft.Office.Interop.Word“;无法激活应用程序“;
当一些用户试图通过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异常,说明“无法激活应用程序”。在调用之前添加
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互操作线程,该线程在返回调用线程的激活调用之前完成初始化。如果您调试线程窗口中看到的是什么?问题就出在这里,我们无法在开发机器上重现这个问题;它只出现在我们的几台笔记本电脑上。我们已经从这些笔记本电脑中制作了一个虚拟机,并在开发人员的机器上运行,但我不知道如何连接到该进程。没有像多年前那样进行测试,但我会接受,因为这听起来很有道理:)