获取 DTE2 引用抛出异常

Getting DTE2 reference throws exception

As instructed,我使用以下行在 VSIX 扩展的菜单项回调中获取 DTE2 实例。

dte2 = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.12.0");

这已经开始崩溃,也许是因为我将 VSIX 移植到 Visual Studio 2017。我收到一个神秘的对话框,上面写着 "operation not available",有时 "Invalid class string (Exception from HRESULT: 0x800401F3(CO_E_CLASSSTRING))"

发生了什么事?

正确的方法是

EnvDTE80.DTE2 dte2 = base.GetService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2;

更不用说 12.0 适用于 VS 2013 而不是适用于 VS 2017。