用于运行代码段和渲染结果的基本VS扩展程序(类似于监视)

时间:2017-05-19 10:45:56

标签: c# .net visual-studio-2015 visual-studio-extensions

我想为Visual Studio开发一个扩展程序,一旦断点被​​击中,它就会在运行时运行一小段代码。

为了增加一些清晰度,我非常希望通过在即时窗口中手动编写代码来调用一些代码并很好地渲染结果(最好是树视图)。

我不愿发表这个问题,因为乍一看似乎相当宽泛,但我相当确定实现这一目标的方法并不多。

我最初看过Roslyn,但我相信只有在我没有弄错的情况下才能编译?

我已经有了这样做的代码,并且它在即时窗口中运行完美,但是我想把它作为一个功能包装起来,因为手动输入它有点麻烦,导航也不容易。我需要的是“手表”和“即时”功能之间。

问题

哪种平台/技术允许我以某种方式扩展Visual Studio,我可以在运行时运行代码片段'ad hoc'并很好地显示结果?

2 个答案:

答案 0 :(得分:0)

我建议调查一下:

答案 1 :(得分:0)

问:哪种平台/技术允许我以某种方式扩展Visual Studio,我可以在运行时运行代码段'ad hoc'并很好地显示结果?

我会按如下方式处理:

  1. 使用新窗口创建visual studio扩展。这涉及安装Visual Studio SDK(它现在随VS一起提供),然后以通常的方式创建一个窗口。例如,您可以查看我的项目https://github.com/atlaste/CPPCoverage - > CoverageExt有一些代码。 https://github.com/Microsoft/VSSDK-Extensibility-Samples上还有很多例子。
  2. 为此,首先在临时文件夹中创建一个小的C#文件。
  3. 基本上你创建一个函数如下:

    // Add some convenient using's.
    
    public class EvaluationClass {
      public static object Evaluate() { 
        return /* paste the evaluated expression here */;
      }
    }
    

    这种方法的好处是结果会自动加框/转换为object,这很好。这里唯一的问题是你可能想要为void情况进行第二次编译运行,这将失败,因为它不能被装箱/转换为对象。

    接下来,

    1. 使用csc.exe编译DLL。相应地处理错误。 CSC位于.NET框架文件夹(c:\windows\microsoft.net\framework[x]\...
    2. 使用反射加载DLL并在扩展名中执行该方法。
    3. 基本技巧如下:

      try {
        var assembly = Assembly.Load(tempDllName);
        // TODO: check if assembly is null --> compilation error
      
        var eval = assembly.GetType("EvaluationClass").GetMethod("Evaluate");
        // TODO: check if eval is null --> compilation error
      
        var result = eval.Invoke();
      
        // Draw result on window
      }
      catch (Exception ex) {
      
        // Handle exception appropriately
      }
      
      1. 改进这个...这里最有用的是从调试器中获取顶部堆栈帧并将this对象作为value传递给方法...我还没有研究如何做到这一点;虽然它应该在API的某个地方提供...