使用VB.NET开发Word VSTO插件.你能在不关闭Word的情况下停止调试吗?



我不知道如何在不关闭Word的情况下停止我的代码运行。这使得在崩溃之前几乎不可能看到我的代码对它正在处理的文档做了什么。

我已经在谷歌上搜索过这个问题好几次了。我看过微软的文档。还没有得到任何答案。

好吧,既然你说无论如何都会发生这种情况,代码无关紧要,那么答案是:不,你不能这样做。对不起。

但是如果你想用程序解决它,你可以做到。我们只是没有足够的信息来告诉你如何用你的特定程序来做到这一点。

细节如下:

不,你不能停止打开word,调试运行,当调试在Visual Studio中停止时word被关闭。当你点击调试(或运行)时,Visual Studio启动一个新的Word实例,当它完成后,它会关闭它,因为它假设你不想让它干扰其他东西。由于您正在编程,因此不可恢复的严重错误完全在可能的范围内。如果有任何类型的错误导致Word崩溃,其他不属于您编程工作的Word实例不应该受到影响。同样的事情发生在做ASP页面时…你会得到一个新的web浏览器实例,而不是使用一个正在运行的实例,即使打开一个新的TAB比打开一个新的word文档更微不足道。在旧版本的VS中,甚至控制台窗口在调试结束后关闭,直到最近我们才能防止这种情况(并隐式地使用相同的控制台窗口)。

所以假设"不,对不起,很糟糕,不是吗?"是一个不可接受的答案,这里是如何开始以编程方式挂钩到一个已经打开的Word实例(下面的代码假设它是打开的,如果不是,将给出一个错误)。Marshal有一个GetActiveObject方法,它可能会为你工作,但你可能最终会调整你的代码,以至于它实际上并没有帮助节省任何时间。(我猜你不喜欢每次关闭和重新打开单词所花费的时间。)不管我是否在猜测,这里是如何进行的。

既然你没有提到版本(这里显然很重要),但你确实提到了VSTO,我在这里使用。net框架4.7.2,因为如果我没记错的话,微软说他们不会继续使用VSTO与核心,所以你可能是框架。如果我错了,或者只是落后,你可以查找已弃用的GetActiveObject的代码,并将其复制并粘贴到一个helper类中,以便你可以使用它-它目前不与。net Core一起工作。

再次,请注意,这并没有考虑到word的多个实例,所以如果您有这种情况,则需要对此进行调整。

Dim oWord As Microsoft.Office.Interop.Word.Application
oWord = Marshal.GetActiveObject("Word.Application")
Console.WriteLine(oWord.Path) 'this is the instance of word, not the individual documents - it is an ApplicationClass type and it is probably what you need to be hooking into
For Each d In oWord.Documents 'd is each document and they are all DocumentClass types ... probably just one for you but you could check for the right one in here if there are multiple documents in play
'call your code here if you need to pass it a DocumentClass or delete this loop entirely if you can pass it an applicationClass above
Dim dName As String = ""
Dim fullPath As String = ""
Console.WriteLine($"Path: {d.Path}") 'this is the path to each open document in that word instance (without file name included)
Console.Read()
Next

注意如果word还没有打开,你会得到:System.Runtime.InteropServices.COMException: 'Operation unavailable

如果这不起作用,你需要编辑这个问题,并包括代码,以便我们可以挂钩到它。还要注意的是,微软关于调试office的提示的第一步是关闭所有的办公应用程序,让visual studio根据需要打开(和关闭)。因此,您已经在预定的线之外着色了。

相关内容

最新更新