打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
向解决方案中添加一个已经存在的工程(EnvDTE)

可以调用EnvDTE,操作Visual Studio,向已经打开的解决方案中添加工程,或者工程中添加文件等等操作

需要引入envdte开头的几个动态库,VSLangProj开头的几个动态库,下面是我写的一个简单的添加工程的例子



using EnvDTE;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;


namespace EnvDTESolution
{
    public class CNxEnvDTEHelper
    {
        [DllImport("ole32.dll")]
        private static extern void CreateBindCtx(int reserved, out IBindCtx ppbc);
        [DllImport("ole32.dll")]
        private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);


        public static Project AddProjectToDTE(_DTE dte, string projectName, bool Exclusive = false)
        {
            if (dte == null || dte.Solution == null)
            {
                return null;
            }


            try
            {
                return dte.Solution.AddFromFile(projectName, Exclusive);
            }
            catch (System.Exception ex)
            {
                //log
                return null;
            }
        }


        public static IList<_DTE> GetAllInstances()
        {
            IList<_DTE> dtes = new List<_DTE>();


            try
            {
                IRunningObjectTable runningObjectTable;
                IEnumMoniker enumMoniker;
                int retVal = GetRunningObjectTable(0, out runningObjectTable);
                if (retVal == 0)
                {
                    runningObjectTable.EnumRunning(out enumMoniker);
                    IntPtr fetched = IntPtr.Zero;
                    IMoniker[] moniker = new IMoniker[1];
                    object punkObject = null;
                    while (enumMoniker.Next(1, moniker, fetched) == 0)
                    {
                        IBindCtx bindCtx;
                        CreateBindCtx(0, out bindCtx);
                        string displayName;
                        moniker[0].GetDisplayName(bindCtx, null, out displayName);
                        bool isVisualStudio = displayName.StartsWith("!VisualStudio");
                        if (isVisualStudio)
                        {
                            runningObjectTable.GetObject(moniker[0], out punkObject);
                            _DTE dte = punkObject as _DTE;


                            if (dte != null)
                            {
                                dtes.Add(dte);
                            }
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                //log
            }


            return dtes;
        }
    }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
com 名字对象(2)创建名字对象(IMoniker)
用DirectShow实现视频采集(二)
Visual Studio 2005 插件编程(代码行数统计插件)之一
JUnit5 安装与使用
Cmd重定向
在exchange 2010中怎样删除已断开连接中的邮箱
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服