使用 IDebugEventCallback2 的 VS2019 扩展

VS2019 extension using IDebugEventCallback2

我使用 VS2019 16.1.6 创建了一个新的 VS 扩展。 我添加了这个使用语句

using Microsoft.VisualStudio.Debugger.Interop;

并将接口 IDebugEventCallback2 添加到我的 class

public sealed class VSIXProject1Package : AsyncPackage, IDebugEventCallback2

不是我得到错误:

error CS0433: The type 'IDebugEventCallback2' exists in both 'Microsoft.VisualStudio.Debugger.Interop, Version=8.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Debugger.InteropA, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

我怎样才能摆脱这个错误?或者除了使用 IDebugEventCallback2 之外,还有其他方法可以对调试器事件做出反应吗?

编辑: 向 Microsoft 报告的问题: https://developercommunity.visualstudio.com/content/problem/651199/vs2019-extension-using-idebugeventcallback2.html

VS2019 使用PackageReference 格式来管理 VSIX 项目的 nuget 包。

并且默认情况下它将引用 Microsoft.VisualStudio.SDKMicrosoft.VSSDK.BuildTools package.Also,因为 Microsoft.VisualStudio.SDK 包依赖于许多其他包,该项目也将引用这些包。

看到这个简单的结构:

Microsoft.VisualStudio.SDK
   ......(other dependencies)
   --Microsoft.VisualStudio.Debugger.Interop
      --Microsoft.VisualStudio.OLE.Interop
   --Microsoft.VisualStudio.Debugger.Interop.10.0
      --Microsoft.VisualStudio.Debugger.InteropA
   ......(11.0,12.0,14.0,15.0)
   --Microsoft.VisualStudio.Debugger.Interop.16.0
      --Microsoft.VisualStudio.Debugger.InteropA

很明显这个问题是由 VSIX 项目添加对 Microsoft.VisualStudio.Debugger.InteropMicrosoft.VisualStudio.Debugger.InteropA 的引用引起的。 这两个程序集具有相同的命名空间 Microsoft.VisualStudio.Debugger.Interop,并且都具有 IDebugEventCallback2 接口。我认为这就是导致此问题的原因。

解决方法:

正常我们可以使用extern alias for this situation. But it hasn't supported for PackageReference format yet. Fortunately I found a good hint from gertjvr。所以我们只需要:

卸载项目=>编辑xxx.csproj=>将以下内容添加到项目文件中:

  <Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
    <ItemGroup>
      <ReferencePath Condition="'%(FileName)' == 'Microsoft.VisualStudio.Debugger.Interop'">
        <Aliases>signed</Aliases>
      </ReferencePath>
    </ItemGroup>
  </Target>

如果您想使用此程序集的界面,您可以将 ReferencePath 更改为 Microsoft.VisualStudio.Debugger.InteropA。这取决于你的需要。