Tag: envdte

ENVDTE – 将新项目添加到现有解决方案并将其定位到特定文件夹中

我在visual studio 2012上使用c#编写了一个Visual Studio向导模板。 我按照MSDN步骤操作:我创建了一个VS模板,然后创建了一个类库项目,其中包含一个实现IWizard接口的类,我配置了.vstemplate文件等… 在我的类库项目中,我从计算机中的某个目录复制现有解决方案,我将新生成的项目添加到该解决方案,然后运行它。 我这样做: public void RunStarted(object automationObject, Dictionary replacementsDictionary, WizardRunKind runKind, object[] customParams) { solutionDir = replacementsDictionary[“$solutiondirectory$”]; destProjectDir = replacementsDictionary[“$destinationdirectory$”]; projName = replacementsDictionary[“$specifiedsolutionname$”]; EmulationDir = @”MY_PATH\TestSln”; DirectoryCopy(EmulationDir, solutionDir); dte = (DTE2)automationObject; } public void RunFinished() { Solution2 solution; Project p; solution = (Solution2)dte.Solution; solution.Open(solutionDir + “\\TestSln.sln”); p = solution.AddFromFile(destProjectDir + “\\” […]

如何在.NET Standard项目中使用EnvDTE

我正在将.net 4.7项目移植到.net标准,它使用T4生成一些代码。 我迭代了类,属性和方法。 这种用法可以很好地工作,但是现在DTE的返回类型是’System .__ ComObject’类型,我无法强制转换它们。 错误:无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“EnvDTE.CodeClass”。 此操作失败,因为对于具有IID'{B1F42514-91CD-4D3A-8B25-A317D8032B24}的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(来自HRESULT的exception:0x80004002(E_NOINTERFACE)) 。 任何想法如何解决这一问题? 例: public static bool CheckBase(CodeClass codeClass, string baseName) { var bases = codeClass.Bases; if (bases != null) { foreach (CodeClass baseClass in bases) { if(baseClass.Name == baseName) return true; } } return false; }

订阅EnvDTE80.DTE2.Events2.PublishEvents.OnPublishBegin的正确方法是什么?

我正在将VS插件移植到VS包中。 初始化包时,包会订阅OnBuildBegin和OnPublishBegin。 Visual Studio按预期触发OnBuildBegin,但从不调用OnPublishBegin。 或多或少相同的代码在Visual Studio 2013,2012和2010中作为插件工作。 但是在VS 2015中作为VS包,OnPublishBegin似乎不起作用。 示例代码如下。 测试运行调试器的代码,该调试器配置为在实验模式下启动VS的第二个实例。 在第二个实例中,我打开另一个解决方案并使用“发布向导”发布。 using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Windows.Forms; using EnvDTE; using EnvDTE80; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; namespace MyPackage { [PackageRegistration(UseManagedResourcesOnly = true)] [InstalledProductRegistration(“#110”, “#112”, “1.0”, IconResourceID = 400)] // Info on this package for Help/About [Guid(VSPackage.PackageGuidString)] [SuppressMessage(“StyleCop.CSharp.DocumentationRules”, “SA1650:ElementDocumentationMustBeSpelledCorrectly”, Justification = “pkgdef, VS and vsixmanifest are […]

通过nuget包添加代码分析规则集

我正在尝试构建一个NuGet包,它可以自动添加我们公司的代码分析字典并可以更新。 规则集已添加到内容文件夹中,现在我想使用install.ps1脚本在项目文件中添加规则集。 我想出去的方法是使用envDTE,但我找不到很多有用的文档,除了这个压倒性的对象图,我找不到CodeAnalysisRuleset节点。 http://msdn.microsoft.com/en-us/library/za2b25t3(v=vs.100).aspx 我在追求正确的道路吗? 是否有关于如何在NuGet powershell中使用envDTE的相关教程/文档? 如何运行/调试我的安装脚本而不必将其实际添加到包并针对项目安装它? 边注 虽然@Nicole Calinoiu表现出更好的方式,但这些信息可能会在以后派上用场: foreach ($config in $project.ConfigurationManager){ $config.Properties.Item(“CodeAnalysisRuleSet”).Value = “myruleset.ruleset” }

以编程方式从addins获取当前的Visual Studio IDE解决方案目录

我有一些工具可以在.NET解决方案上执行更新,但是他们需要知道解决方案所在的目录。 我将这些工具添加为外部工具,它们出现在IDE工具菜单中,并提供$(SolutionDir)作为参数。 这很好用。 但是,我希望通过自定义顶级菜单(我为其创建Visual Studio集成包项目)以及通过解决方案节点上的上下文菜单(我为其创建了一个Visual),在IDE中为用户更轻松地访问这些工具。 Studio加载项目)。 我正在寻找一种方法来通过这些上下文获取当前的解决方案目录。 我尝试从VisualStudio.DTE对象获取解决方案信息: EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject(“VisualStudio.DTE”); string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 但是,这将返回add ins的解决方案目录,而不是当前解决方案。 我尝试回显$(SolutionDir)并将其读回: System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo(“cmd”, “echo $(SolutionDir)”); // The following commands are needed to redirect the standard output. // This means that it will be redirected to the Process.StandardOutput StreamReader. procStartInfo.RedirectStandardOutput = true; procStartInfo.UseShellExecute = false; […]

使用T4 / EnvDTE获取使用特定属性修饰的所有方法

我想获得我的项目中使用T4 / EnvDTE使用MyAttribute修饰的所有公共方法的列表。 我知道这可以通过reflection完成,但我不想加载程序集并在T4模板中反映它,而是我想使用现有的代码文件作为源代码。 以下是我在互联网上找到的样板代码,它获取对当前项目的引用

将项添加到AddIn中的visual studio文件夹右键菜单

我想在visual studio 2012解决方案资源管理器中右键单击=>添加菜单添加一个menuitem。 单击自定义项目时,我可以使用我的模板添加项目。 我开发了一个Visual Studio加载项来实现它,但是我遇到了一些麻烦。 我可以在右键菜单中添加一个menuitem,但我无法满足我的要求。 menuitem应该是“Add”的子菜单。 不是根项目。 我还需要menuitem才能在我右键单击名为“Areas”的文件夹时显示。 当我右键单击其他文件夹时,我不希望它显示。 这是我的OnConnectionfunction代码。 如何更改它以满足我的要求。 public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = ((AddIn)addInInst); if (connectMode == ext_ConnectMode.ext_cm_UISetup) { object[] contextGUIDS = new object[] { }; Commands2 commands = (Commands2)_applicationObject.Commands; //Place the command on the tools menu. //Find […]

在C#T4模板中通过DTE访问项目

我目前正在尝试迭代我的所有项目(sharepoint)以将所有functionguid放入文件中。 我想在它们前面加上项目名称。 我的问题是DTE.Solution.Item和DTE.Solution.Projects.Item(或foreach的枚举器)不会将整数作为参数,foreach返回一个不能转换为Project的对象。 这是我的代码片段: var hostServiceProvider = (IServiceProvider) Host; var dte = (DTE) hostServiceProvider.GetService(typeof(DTE)); var projectCount = dte.Solution.Projects.Count; var projects = new Dictionary(); foreach(Project dteProject in dte.Solution) { var dteProject = dte.Solution.Item(i); projects.Add(dteProject.Name, dteProject.FullName); } 好的 – 代码没问题 – 调试器不是! 抛出调试上下文的我的exception,但如果没有附加调试器,模板将运行正常。

在Visual C#2010中获取DTE2对象的引用

我想获得对当前解决方案的引用,在Visual Studio 2010中使用带有C#的DTE2对象。 我首先尝试了以下代码: var dte = Marshal.GetActiveObject(“VisualStudio.DTE.10.0”) as EnvDTE80.DTE2; 但是当我打开2个解决方案,并且这个代码在第一个解决方案中时,我得不到对当前解决方案的引用,而是对我加载的最后一个解决方案的引用。 我需要当前的解决方案…… 在互联网上搜索,我发现以下解决方案如何从VSPackage获取当前的解决方案目录? : // Get an instance of the currently running Visual Studio IDE DTE dte = (DTE)GetService(typeof(DTE)); 但是当我使用它时,我的dte对象总是为NULL。 那么如何使用C#on .net framework 4.0获取VS2010中当前的解决方案对象?

如何获取当前Visual Studio解决方案中的项目列表?

当我们在任何开放式解决方案中打开Package Manager Console时,它会显示该解决方案的所有项目。 如何加载同一解决方案的所有项目。 当我尝试下面显示的代码时,它正在取出我打开的第一个解决方案的项目。 private List GetProjects() { var dte = (DTE)Marshal.GetActiveObject(string.Format(CultureInfo.InvariantCulture, “VisualStudio.DTE.{0}.0”, targetVsVersion)); var projects = dte.Solution.OfType().ToList(); return projects; }