C# 模拟DTE接口时MissingMethodException

C# 模拟DTE接口时MissingMethodException,c#,visual-studio,nunit,moq,envdte,C#,Visual Studio,Nunit,Moq,Envdte,我正在努力解决与VisualStudioSDK“EnvDTE”相关的测试问题。假设我有一个C#解决方案,它的NuGet依赖于、以及它们的所有可传递依赖项(该解决方案可以作为一个解决方案使用,以便于使用) 我的项目包含两个文件。包含一些简单的逻辑,可以向某些DTE接口中定义的事件添加(无意义的)侦听器 public class Foo { public static void Bar(Events e) { e.SolutionEvents.Opened += () =&g

我正在努力解决与VisualStudioSDK“EnvDTE”相关的测试问题。假设我有一个C#解决方案,它的NuGet依赖于、以及它们的所有可传递依赖项(该解决方案可以作为一个解决方案使用,以便于使用)

我的项目包含两个文件。包含一些简单的逻辑,可以向某些DTE接口中定义的事件添加(无意义的)侦听器

public class Foo
{
   public static void Bar(Events e)
   {
      e.SolutionEvents.Opened += () => { };
   }
}
中定义的相应测试用例
BarTest
,创建DTE接口的模拟实例,并将其作为参数传递给
Foo.Bar

[Test]
public void BarTest()
{
    var events = Mock.Of<Events>();
    var solutionEvents = Mock.Of<SolutionEvents>();
    Mock.Get(events).SetupGet(evts => evts.SolutionEvents).Returns(solutionEvents);

    Foo.Bar(events);
}

private void XXX()
{
    Events e = null;
    e.SolutionEvents.Opened += () => { };
}
出于某种原因,
XXX
的存在会影响测试运行,因为Moq似乎无法找到打开的
事件的定义。我发现这种行为非常奇怪,我真的不明白是什么导致了这个问题。这是最小起订量的问题吗?它与COM类型的类加载有关吗


如果有比我聪明的人能解释这个问题,我将不胜感激。提前感谢!:)

Visual Studio DTE/加载项SDK已弃用。您应该使用VSIXSDK;VSPackage;或托管包框架。我很感激您的提示,但据我所知,这需要我在扩展中放弃对2015年之前的Visual Studio版本的支持/你应该能够抽象出你的产品。我明白了。不过,我的实际代码仍在运行,因此现在,我更希望了解测试中出现此问题的原因,而不是升级生产代码。这就是为什么不推荐使用Visual Studio DTE/add-in SDK是注释而不是应答。您应该使用VSIXSDK;VSPackage;或托管包框架。我很感激您的提示,但据我所知,这需要我在扩展中放弃对2015年之前的Visual Studio版本的支持/你应该能够抽象出你的产品。我明白了。不过,我的实际代码仍在运行,所以现在,我更希望了解测试中出现此问题的原因,而不是升级生产代码。这就是为什么它是注释而不是答案
System.MissingMethodException : Error: Missing method 'instance void [MyProject] EnvDTE._dispSolutionEvents_Event::add_Opened(class EnvDTE._dispSolutionEvents_OpenedEventHandler)' from class 'Castle.Proxies.ObjectProxy_1'.
    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
    at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
    at System.Reflection.EventInfo.AddEventHandler(Object target, Delegate handler)
    at System.Runtime.InteropServices.ComAwareEventInfo.AddEventHandler(Object target, Delegate handler)
    at MyProject.Foo.Bar(Events e) in C:\Users\seb2\versioned\dte-mocking-minimal\MyProject\Foo.cs:line 25
    at MyProject.Test.FooTest.BarTest() in C:\Users\seb2\versioned\dte-mocking-minimal\MyProject.Test\FooTest.cs:line 32