我正在使用VSIX开发Visual Studio可扩展性项目.默认情况下,VSIX文件将程序集安装在以下文件夹之一中:
C:\Users\<UserName>\Appdata\Local\Microsoft\VisualStudio\10.0Exp\Extensions\Microsoft\<GPName>
C:\Users\<UserName>\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Microsoft p&p\<GPName>
Run Code Online (Sandbox Code Playgroud)
是否可以更改输出位置?
BuildEvents.OnBuildDone如果由于用户想要启动调试会话而触发了构建,我希望我的 VSIX 在我的处理程序中做一些不同的事情。
我试过了...
private void m_BuildEvents_OnBuildDone(vsBuildScope scope, vsBuildAction action) {
if (m_DTE.Mode == vsIDEMode.vsIDEModeDebug) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
...但不幸的是在这一点m_DTE.Mode上还不等于vsIDEMode.vsIDEModeDebug.
我可以启动一个一两秒的计时器,然后检查是否(m_DTE.Mode == vsIDEMode.vsIDEModeDebug)但这不是一个干净可靠的解决方案。
我可以通过查询 VSIX API 以某种方式知道,无论是 inBuildEvents.OnBuildBegin还是BuildEvents.OnBuildDonehandler,成功的构建之后都会有一个 Debug 会话吗?
我想编写一个 VSIX LSP 扩展。我希望它以最简单的方式工作 - 这似乎是使用“打开文件夹”功能来打开代码文件夹,然后做我的事情。
要启动 LSP 服务器,我需要知道打开的文件夹的目录。我如何知道 Visual Studio 是否处于“打开文件夹”模式(如果不是,则不应启动 LSP),以及如何知道该文件夹的路径(以便我可以启动 LSP 服务器)?
我发现https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.shell.interop.ivssolutionevents7?view=visualstudiosdk-2017这似乎很有希望,因为我可以在某些特定文件夹出现时进行注册打开 - 告诉我已使用“打开文件夹”功能的事件可能是完美的 - 如果打开文件夹,则启动该文件夹的 LSP。
vs-extensibility vsix visual-studio-extensions language-server-protocol
我想创建一个 VisualStudio 扩展,将命令添加到“调试”菜单。该模板包含以下行:
<Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
Run Code Online (Sandbox Code Playgroud)
它将按钮添加到工具菜单中。遗憾的是,我不知道如何更改该行,以便该按钮出现在“调试”菜单中。
根据此网站https://msdn.microsoft.com/en-us/library/cc826118.aspx,没有调试菜单之类的东西:-/
我不使用 VSIX 进行集成(支持旧的 VS 和 SSMS)。安装程序将所有 dll 放入“程序文件”并将 pkgdef 和清单放入特定文件夹。目前 VS2019 显示我的扩展使用“已弃用的 API”的消息。
带有来自 docs.microsoft.com 的消息的图像,但它是相同的。
我完成了以下步骤:
我的包看起来如此(构造函数现在是空的)
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
[InstalledProductRegistration("#110", "#112", "7.1.7", IconResourceID = 115)]
[ProvideMenuResource("MyMenus.ctmenu", 1)]
[ProvideAutoLoad(GuidList.ShellInitialized, PackageAutoLoadFlags.BackgroundLoad)]
[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string, PackageAutoLoadFlags.BackgroundLoad)]
[System.Runtime.InteropServices.Guid(GuidList.guidMyPkgString)]
public sealed class MyPackage : AsyncPackage {
Run Code Online (Sandbox Code Playgroud)
但是 VisualStudio 一次又一次地显示有关已弃用 API 的消息。我错过了什么?VS 在包加载期间检查什么?
编辑:我创建了 AsyncPackage,添加了属性,将集成文件更新到 VsixV3。为什么VS同步加载扩展?
我正在使用 vs. 中的自定义起始页模板。
我将如何嵌入可以在起始页 xaml 中使用的图像。我尝试了将图像设置为资源并将图像控件上的源属性设置为文件名的正常方法。
<Image Source="logo.jpg" />
Run Code Online (Sandbox Code Playgroud)
但它不起作用......它构建正常并正常旋转起始页,但不显示图像。如果我坚持一个可以正常工作的源网址。
谢谢史蒂夫
我想创建自己的具有全球知名度的服务。为了实现这一点,我遵循了这个示例解决方案。
一切顺利,我可以在一个类中调用我的服务,该类扩展自 Package 抽象类,如下所示:
public class ClientPackage : Package
{
private void GetGlobalServiceCallback(object sender, EventArgs args)
{
IMyGlobalService service = GetService(typeof(SMyGlobalService)) as IMyGlobalService;
}
}
Run Code Online (Sandbox Code Playgroud)
因为我在一个包中,所以我可以轻松调用 GetService 并且可以获得我的服务。但是,如果我想从一个不扩展 Package 抽象类的类获取服务,该怎么办?
例如,我有一个类,它实现了 ITagger 接口。如果我想获取此类中的服务,我必须以这种方式使用 Package.GetGlobalService() 方法:
var txtMgr = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));
Run Code Online (Sandbox Code Playgroud)
我尝试使用 Package.GetGlobalServie() 获取自己的服务,但总是得到 null。链接的示例代码不包含我的问题的解决方案。
我可能错过了什么或者我在获得服务时遇到了错误的情况吗?
编辑:
好吧,假设我必须使用 MEF 来获取我的服务,因为我无法使用 Package.GetGlobalService() 获取我的服务。
我有一个包含 2 个项目的解决方案。一种是类库,其中包含这样的接口:
public interface INamesAccessor
{
IEnumerable<string> GetNames();
}
Run Code Online (Sandbox Code Playgroud)
另一个项目是 VSPackage(与第一个项目有参考),它也实现了我的接口:
[Export(typeof(INamesAccessor))]
public sealed class BitbucketExtensionPackage : Package, INamesAccessor
{
private IEnumerable<string> _names { get; set; } …Run Code Online (Sandbox Code Playgroud) 编辑:注意:我正在使用Visual Studio 2015
我正在尝试使用VSIX项目编写一个VisualStudio扩展,它显示当前加载的解决方案的所有引用.
我可以使用下面的代码获取当前的解决方案和项目(所有项目,实际上).
我将问题代码分离为GetProjectReferences方法.
我无法参考VSLangProj.VSProject.
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as
var sol = dte2.Solution;
var projs = sol.Projects;
foreach (Project project in projs)
{
if (project.Kind == ProjectKinds.vsProjectKindSolutionFolder)
{
//Ignoring Solution Folders for now
}
else
{
//This method tries to get the refernces
AppendProject(sb,project);
}
}
private void GetProjectReferences(StringBuilder sb, Project project)
{
var vsProject = project.Object as VSLangProj.VSProject;
var references = vsProject.References as VSLangProj.References;
sb.AppendLine(project.Name + ": " + references.Count);
int counter …Run Code Online (Sandbox Code Playgroud) 我需要编写一个应用程序来确认 Visual Studio 的关闭?我认为,可以使用WinForms中的FormClosing事件,并且可以取消关闭。
主要需求是防止 Visual Studio 2017 意外退出。但是 VS 2015+ 有 Metro UI。NoClose从标题栏右键菜单中删除关闭菜单,但无法禁用右上角的关闭按钮。
编辑
为什么需要这个:通常我有很多打开的窗口。我使用 WhatsApp 桌面版,但该应用程序未以全屏模式启动。但看起来它已经最大化了。当我尝试通过将指针移动到屏幕右上方(在我的右侧显示器上,甚至不检查窗口是否最大化)来快速关闭它时,我实际上单击了该窗口下的应用程序。其中主要是 Visual Studio。最终 VS 关闭。我正在使用一个非常大的解决方案,因此打开或关闭该解决方案需要很长时间。由于 VS 不是开源的,我需要以某种方式确认退出。这很烦人,而且发生得太频繁(一天 2-3 次)。
另请注意,我不是唯一需要此选项的开发人员,其他 IDE 已经有这样的选项。