使用 VB.NET 开发 Word VSTO 插件。不关闭 Word 就可以停止调试吗?
Developing Word VSTO addin using VB.NET. Can you stop debugging without closing Word?
我不知道如何在不关闭 Word 的情况下从 运行 停止我的代码。这使得在它崩溃之前几乎不可能看到我的代码对正在处理的文档做了什么。
我已经多次用谷歌搜索这个问题。我查看了 MS 文档。还没有接近答案。
好吧,既然你说无论如何都会发生这种情况并且代码无关紧要,那么答案是:不,你不能那样做。对不起。
但是如果你想以编程方式解决它,你可以这样做。我们只是没有足够的信息来告诉您如何使用您的特定程序进行操作。
详情如下:
不,你不能停止打开单词,调试 运行s,调试在 Visual Studio 内停止时关闭单词。当您点击调试(或 运行)时,Visual Studio 启动一个新的 Word 实例,完成后关闭它,因为它假设您不希望它与其他东西混淆。由于您正在编程,因此无法恢复的严重错误完全在可能性范围内。如果存在导致 Word 崩溃的任何类型的错误,则不属于您的编程工作的其他 Word 实例不应受到影响。在做 ASP 页面时也会发生同样的事情......你会得到一个新的网络浏览器实例,而不是使用 运行ning 实例,即使打开一个新标签比打开一个新标签更简单字文档。对于旧版本的 VS,甚至控制台 window 在结束调试后关闭,直到最近我们才能防止这种情况发生(并隐式使用相同的控制台 window)。
所以假设“不,抱歉,很糟糕,不是吗?”是一个不可接受的答案,这里是你如何开始以编程方式连接到一个已经打开的 Word 实例(下面的代码假定它是打开的,如果没有打开则会给出错误)。 Marshal 有一个 GetActiveObject 方法,它可能对您有用,但您最终可能会将代码调整到它实际上无助于节省任何时间的程度。 (我猜你不喜欢每次关闭和重新打开单词所花费的时间。)不管我是否在这里猜测是如何开始的。
因为你没有提到版本(这显然很重要)但你确实提到了 VSTO 我在这里使用了 .net framework 4.7.2 因为如果我没记错的话,MSFT 说他们不会继续使用VSTO with Core 所以你可能在框架上。如果我错了或落后了,您可以查找已弃用的 GetActiveObject 的代码并将其复制并粘贴到帮助程序 class 中,以便您可以使用它 - 虽然它目前不适用于 .Net Core。
再次请注意,这并没有考虑单词的多个实例,因此如果您正在玩该场景,则需要对此进行调整。
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: '操作不可用
如果这不起作用,您将需要编辑此问题并包含代码,以便我们可以挂钩它。另请注意,微软关于调试 office 的提示的第 1 步是关闭所有 office 应用程序,并根据需要让 visual studio 打开(和关闭)。所以你已经在预期的线条之外着色了。
我不知道如何在不关闭 Word 的情况下从 运行 停止我的代码。这使得在它崩溃之前几乎不可能看到我的代码对正在处理的文档做了什么。
我已经多次用谷歌搜索这个问题。我查看了 MS 文档。还没有接近答案。
好吧,既然你说无论如何都会发生这种情况并且代码无关紧要,那么答案是:不,你不能那样做。对不起。
但是如果你想以编程方式解决它,你可以这样做。我们只是没有足够的信息来告诉您如何使用您的特定程序进行操作。
详情如下:
不,你不能停止打开单词,调试 运行s,调试在 Visual Studio 内停止时关闭单词。当您点击调试(或 运行)时,Visual Studio 启动一个新的 Word 实例,完成后关闭它,因为它假设您不希望它与其他东西混淆。由于您正在编程,因此无法恢复的严重错误完全在可能性范围内。如果存在导致 Word 崩溃的任何类型的错误,则不属于您的编程工作的其他 Word 实例不应受到影响。在做 ASP 页面时也会发生同样的事情......你会得到一个新的网络浏览器实例,而不是使用 运行ning 实例,即使打开一个新标签比打开一个新标签更简单字文档。对于旧版本的 VS,甚至控制台 window 在结束调试后关闭,直到最近我们才能防止这种情况发生(并隐式使用相同的控制台 window)。
所以假设“不,抱歉,很糟糕,不是吗?”是一个不可接受的答案,这里是你如何开始以编程方式连接到一个已经打开的 Word 实例(下面的代码假定它是打开的,如果没有打开则会给出错误)。 Marshal 有一个 GetActiveObject 方法,它可能对您有用,但您最终可能会将代码调整到它实际上无助于节省任何时间的程度。 (我猜你不喜欢每次关闭和重新打开单词所花费的时间。)不管我是否在这里猜测是如何开始的。
因为你没有提到版本(这显然很重要)但你确实提到了 VSTO 我在这里使用了 .net framework 4.7.2 因为如果我没记错的话,MSFT 说他们不会继续使用VSTO with Core 所以你可能在框架上。如果我错了或落后了,您可以查找已弃用的 GetActiveObject 的代码并将其复制并粘贴到帮助程序 class 中,以便您可以使用它 - 虽然它目前不适用于 .Net Core。
再次请注意,这并没有考虑单词的多个实例,因此如果您正在玩该场景,则需要对此进行调整。
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: '操作不可用
如果这不起作用,您将需要编辑此问题并包含代码,以便我们可以挂钩它。另请注意,微软关于调试 office 的提示的第 1 步是关闭所有 office 应用程序,并根据需要让 visual studio 打开(和关闭)。所以你已经在预期的线条之外着色了。