【发布时间】:2013-03-13 12:31:18
【问题描述】:
我正在使用 Visual Studio 2012
我在一个项目中有一个 T4 模板,用于从现有代码生成代码。 为此,我使用 Visual Studio Env.DTE-API。 与描述相同的错误将在简单的控制台应用程序中引发,因此在我的项目中不会出现问题。
几个星期以来,一切都运行良好。
今天我只是偶尔遇到一个例外。同一个项目像魅力一样在同事的机器上运行,从来没有例外。
这让我假设我的 Visual Studio 或我的机器的某些东西通常会引发此异常,而不是项目本身。
异常如下(我删减了一点):
错误 7 运行转换:System.Runtime.InteropServices.COMException (0x800401E3): Vorgang nicht verfügbar。 (来自 HRESULT 的异常:0x800401E3 (MK_E_UNAVAILABLE)) 在 System.Runtime.InteropServices.Marshal.GetActiveObject(Guid 和 rclsid,IntPtr 保留,对象和 ppunk) 在 System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)
抛出异常的代码如下:
DTE dte = (DTE) Marshal.GetActiveObject("VisualStudio.DTE");
我的问题是: 我使用的代码通常有什么问题或关键吗? 而且,也许有人知道 Visual Studio 或运行它的机器可能出了什么问题。
我已经运行了可以在 (Marshal.GetActiveObject() throws MK_E_UNAVAILABLE exception in C#) 上找到的代码示例,我的 Visual Studio 实例在 ROT 中是可见的。
最好的问候
【问题讨论】:
-
用调用"DTE2 dte2 = (DTE2)Marshal.GetActiveObject("VisualStudio.DTE.11.0");"它似乎工作。 DTE2 代替 DTE。我的想法来自:msdn.microsoft.com/en-us/library/vstudio/yf86a8ts.aspx
-
使用 T4 模板和 this.Host 属性可以更好地工作,如下所述:stackoverflow.com/questions/3548026/…
-
我在尝试获取安装了两个版本的 VS 实例时收到此错误。在注册表中查找与“VisualStudio.DTE*”匹配的最大 CLSID 并找到这个有效的:
DTE dte = (DTE) Marshal.GetActiveObject("VisualStudio.DTE.14.0");
标签: visual-studio exception marshalling envdte