Control VS.NET IDE in your Project in design-time

本文探讨了如何在VS.NET IDE中通过Add-in定制行为和功能,特别是在design-time控件中访问Project信息的方法。介绍了使用COM和RunningObjectTable遍历来获取当前IDE的ObjectModel实例,实现对Project特性的定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    VS.NET 的envdte 提供了VS.NET的Object Model的接口,在VS.NET中我们可以通过加入Add-in来定制IDE的行为和功能。但是有时候们希望能在design-time控件中取得一些关于Project的信息,定制一些与本Project相关的特性。这时有没有一种方法能在自己的控件中访问当前IDE的Object Model的方法呢?
    MSDN VisualStudio的文档中提到过我们可以使用Marshal.GetActiveObject(“VisualStudio.DTE.7.1“)来获取激活的IDE的实例.但是实际尝试你就会发现,它永远返回最初打开的IDE的接口,所以这个方法在用户打开多个IDE的时候无法使用.
    那是否还有其它方法实现呢? 有, 不过我们还是要回到COM中寻找解决方法, 我们可以通过遍历Running Object Table匹配他们的displayname来找到当前的DTE的引用.
这里有个简单的示例:
把它加到Form上你就可以看到当前Project的full name.

using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

using System.Collections;

using System.ComponentModel;

using System.ComponentModel.Design;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

using System.Windows.Forms.Design;

using EnvDTE;

using System.Runtime.InteropServices;

 

namespace DTE_TEst

{

     [

     Designer(typeof(MyCtlDesigner))

     ]

     public class MyCtl : System.Windows.Forms.TextBox

     {

         private System.ComponentModel.Container components = null;

         public MyCtl()

         {

              InitializeComponent();

         }

         private void InitializeComponent()

         {

              components = new System.ComponentModel.Container();

         }

     }

 

     class MyCtlDesigner : ControlDesigner

     {

         public override void OnSetComponentDefaults()

         {

              //Moniker string definition: "!VisualStudio.DTE.7.1:"

              string strMoniker = "!VisualStudio.DTE.7.1:" +

                   System.Diagnostics.Process.GetCurrentProcess().Id.ToString();

              MessageBox.Show(strMoniker);

 

              EnvDTE._DTE dte =(EnvDTE._DTE)GetMSDEVFromGIT(strMoniker);

              this.Control.Text = dte.Solution.FullName;

         }

 

         [DllImport("ole32.dll")] 

         public static extern int GetRunningObjectTable(int reserved, out

              UCOMIRunningObjectTable prot);

 

         [DllImport("ole32.dll")] 

         public static extern int  CreateBindCtx(int reserved, out UCOMIBindCtx ppbc);

 

 

         public object GetMSDEVFromGIT(string strProgID) 

         {  

              UCOMIRunningObjectTable prot;   

              UCOMIEnumMoniker pMonkEnum;  

 

              GetRunningObjectTable(0,out prot);   

              prot.EnumRunning(out pMonkEnum);   

              pMonkEnum.Reset();

              int fetched;   

              UCOMIMoniker []pmon = new UCOMIMoniker[1];   

              while(pMonkEnum.Next(1, pmon, out fetched) == 0)    

              {    

                   UCOMIBindCtx pCtx;    

                   CreateBindCtx(0, out pCtx);    

                   string str;    

                   pmon[0].GetDisplayName(pCtx,null,out str);   

                   if(str == strProgID)  

                   { 

                       object objReturnObject; 

                       prot.GetObject(pmon[0],out objReturnObject);

                       object ide = (object)objReturnObject; 

                       return ide; 

                   } 

              }

              return null;

         }

     }

}

这个问题体现了VS.NET IDE一个有趣的特性,有人知道Java 的IDE有没有这样的特性呢?

转载于:https://www.cnblogs.com/jonnyyu/archive/2004/02/20/1439.html

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值