【问题标题】:Env.DTE usage on Visual Studio 2012 throws sometimes MK_E_UNAVAILABLEVisual Studio 2012 上的 Env.DTE 使用有时会抛出 MK_E_UNAVAILABLE
【发布时间】: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


【解决方案1】:

据观察,如果以提升权限运行的进程尝试获取与未提升权限运行的进程的接口,您将始终收到此错误,反之亦然。

【讨论】:

  • 因此,例如:一个 Visual Studio 以管理员身份运行,而另一个 Visual Studio 确实以普通用户身份运行。如果先调用后者的接口,反之亦然,会出现我描述的问题吗?因为在我的解决方案中,只有一个实例可以访问 itsef,所以很清楚为什么它适用于您的描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多