Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
Авдеев Вячеслав
@lsoft
it's your choice, I decided not to support VS older than 16.8 for example.
(and I also use IVsOperationProgressStatusService)
Авдеев Вячеслав
@lsoft
if I understand correctly supporting < 16.0 and >= 16.8 will make your VSIX easier. so I was wondering is there a real reason (real scenario may be) to support >= 16.0?..
Yann Duran
@yannduran
@yacoubmassad_gitlab no I don't believe so. the reason I mentioned the Community Toolkit was to show how it managed to provide the appropriate code based on VS version, the same scenario as you've described. You should be able to use that technique in a single VSIX as well, with multiple DLL's in a single VSIX, similar to what the Toolkit Nuget package is doing. I've also seen extensions dynamically load DLL's that are based on different VS versions
Andy Hippo
@werat

Hi everyone!

I'm working on an extension that provides a custom debug engine for Visual Studio -- https://github.com/googlestadia/vsi-lldb. The debug engine is similar to MIEngine (https://github.com/microsoft/MIEngine). The underlying debugger is LLDB and the extension provides all the necessary integrations (attach, stepping, natvis and expression evaluation, etc).

My question is about implementing custom code-completion in the Immediate Window.

The expressions in the Immediate Window are handled by IDebugExpressionContext2 [1] and IDebugExpression2. This works fine, when the user enters the expressions and hits Enter IDebugExpressionContext2::ParseText is invoked, IDebugExpression2 object is created and the expression is eventually evaluated [2].

Now I want to implement basic code-completion for the expressions in the Immediate Window. For example, to show a list of members when the user types foo-> and such. I can easily do this using my expression evaluation engine (https://github.com/google/lldb-eval), but I can't figure out how to implement it in Visual Studio.

I have found an interface IVsImmediateStatementCompletion2 [3]. Looking at the name, this seems like exactly what I want :) However I'm not sure how what is the proper way to impement this interface. The documentation says this interface should be implemented on the same object that implements IVsLanguageInfo -- this matches what I see in Roslyn [4].

My extension currently doesn't provide a language service implementation, only the debug engine. I've tried adding a dummy implementation like class MyLanguageService : IVsLanguageInfo, IVsImmediateStatementCompletion2 and registering it via [ProvideLanguageService] and [ProvideService]. After I registered it for ".cpp" files, I can see that methods for IVsLanguageInfo are being called (namely GetColorizer and GetCodeWindowManager), but IVsImmediateStatementCompletion2 is never triggered.

So here's the big question, how do I implement a custom completion for the Immediate Window in my DebugEngine? :) Thanks!

[1] https://docs.microsoft.com/en-us/visualstudio/extensibility/debugger/reference/idebugexpressioncontext2?view=vs-2019
[2] https://github.com/googlestadia/vsi-lldb/blob/121d52b74564a51dc7e860c7c1eb9729b20627b3/YetiVSI/DebugEngine/DebugStackFrame.cs#L222
[3] https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.textmanager.interop.ivsimmediatestatementcompletion2?view=visualstudiosdk-2017
[4] https://github.com/dotnet/roslyn/blob/dd21600f51cf5464b4721b69ab1c8e86bfa0c101/src/VisualStudio/Core/Def/Implementation/LanguageService/AbstractLanguageService%602.IVsImmediateStatementCompletion2.cs#L20

vasantha-kumar25
@vasantha-kumar25
If We want to deploy a VS extension project via a custom Installer (such as NSIS) instead of distributing via VSIX, Under what directory we might need to deploy the output files so that VS will detect them?
Erik Ejlskov Jensen
@ErikEJ
Can we publish 2 packages to the same Marketplace Id with an extension for VS 2019 and VS 2022 (as we now need to build two VSIX files) ???
Yann Duran
@yannduran
@ErikEJ no each extension would have to have its own id if it's not just a one package is installable on both 2017/2019
Robert van der Hulst
@RobertvanderHulst
@vasantha-kumar25 We deploy our extensions directly to the Common7\Ide\Extensions\OurProduct subfolder inside VS and then run VS with the /updateconfiguration command line option so it can detect our extension.
vasantha-kumar25
@vasantha-kumar25
@RobertvanderHulst Thank you :)
Andy Hippo
@werat
@RobertvanderHulst Does the "uninstall" flow work properly for you with this setup? I'm also deploying my extension by directly copying the files to the "Extensions" dir, but I also update the configs in "ProgramData\VisualStudio\Packages..." (writing path from memory, might not be exactly it). Without it, the "uninstall" button from Visual Studio (on vsixinstaller) doesn't work -- I get an error and the extension stays. I also noticed that this happens only if deploying the extension to the VS installation (i.e. "admin" mode). When deploying to "AppData..." (i.e. "user" extension), the uninstall works fine.
Sajal Verma
@sajalverma17
Can anyone suggest an approach for tagging a EnvDTE.ProjectItem in such a way that the tag value is not exposed, but private to my plugin. I am trying to classify some C# class files in SolutionExplorer, such that I can set a tag "MyFileTypeTag", with value: "GoodFile"/"BadFile"/etc..., then later get the same tag's value when user selects that EnvDTE.ProjectItem in SolutionExplorer.
CyrusNajmabadi
@CyrusNajmabadi
use a ConditionalWeakTable?
Sajal Verma
@sajalverma17
Ok thanks, I'll check out usages of ConditionalWeakTable, never used it before.
Robert van der Hulst
@RobertvanderHulst
@werat We do not use the uninstall button inside VS. The uninstaller for our setup clears the subfolder inside the Extensions folder, clears the ComponentModelCache and VTC folders in the users local appdata Microsoft\VisualStudio\15_uniqueId (and 16_uniqueid) folder and runs VS with /updateconfiguration again. That works for VS2017 and VS2019 at least.
This may not be the recommended way to do it, but it most certainly works for us
Robert van der Hulst
@RobertvanderHulst
I am wondering how others are handling the situation where the user splits the editor window, in relation to the Navigationbar. Are you creating your own VsCodeWindowManager and creating a single Dropdownbar for all textviews for the codewindow. Or are you creating a dropdown bar per textview in response to the VsTextViewCreated event. And how do you make sure that the right dropdown is shown when the focus switches between the 2 halves of the splitted file ?
vasantha-kumar25
@vasantha-kumar25

@werat Regarding the Uninstall Button in VS Extension and updates:

@RobertvanderHulst Does the "uninstall" flow work properly for you with this setup? I'm also deploying my extension by directly copying the files to the "Extensions" dir, but I also update the configs in "ProgramData\VisualStudio\Packages..." (writing path from memory, might not be exactly it). Without it, the "uninstall" button from Visual Studio (on vsixinstaller) doesn't work -- I get an error and the extension stays. I also noticed that this happens only if deploying the extension to the VS installation (i.e. "admin" mode). When deploying to "AppData..." (i.e. "user" extension), the uninstall works fine.

When We deploy the Extension directly to Common7\Ide\Extensions\OurProduct Location the Uninstall button is disabled by default. Can I kindly know What configs did you add to"ProgramData\VisualStudio\Packages..." to make Uninstall button work?

1 reply
Chris Varone
@Vero1010110_twitter
Hello all, I'm having a real compatibility issue. I'm developing in VS2019 and I need things to work in VS2017.
 private async Task LoadDataGridAsync()
        {
            try
            {
                // if we are not executing in the main thread then we need to go to the main thread and alter the UI so we can update the data grid. 
                if (thisControl.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
                {
                    await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
When I have this API in my code VS2017 just has a conniption.
The SwitchToMainThreadAsync()
I need a way to get to the main thread an modify the GUI.
Chris Varone
@Vero1010110_twitter
SO experimentation so far has shown that a synchronous command to update the GUI thread seems to be the only way to get this to work.
i.e. ThreadHelper.Generic.BeginInvoke(() =>
{
CyrusNajmabadi
@CyrusNajmabadi
what do you mean "just has a conniption"?
Chris Varone
@Vero1010110_twitter
well the debugger spits out that the visual studio DLL's thrown a repeating exception. and the thread never get's executed. but nothing visually happens on visual studio and the GUI does not update. it basically attempts to launch the thread but having the call to SwitchToMainThreadAsync() makes the whole thing asnync function seem to abort. Debugger never hits a single line of code within the function when when calling it directly and synchronously
This seems to be some sort of compability issue with the VisualStudio.threading.dll beteen VS2017 and VS2019
if I await on the function I never reach a breakpoint with the function either. Just to clarify
Andy Hippo
@werat
@vasantha-kumar25 I need to refresh my knowledge about all the hacks I had to do :) I'll take a look later this week and get back to you
Neil Henderson
@bluetarpmedia
@Vero1010110_twitter I think you need to do two things. First, change your Microsoft.VisualStudio.Threading nuget package to the very latest 15.x version (Maor Version 15 = VS 2017), if it's not already. That will work in both 2017 and 2019. Second, you don't need the if (thread != current thread) stuff. The call to SwitchToMainThreadAsync is very cheap, so just do it whenever you need to be on the main thread. Don't use any of the BeginInvoke stuff. For more info, see this: https://github.com/microsoft/vs-threading/blob/main/doc/cookbook_vs.md
Yann Duran
@yannduran
@bluetarpmedia I was just reading down the the thread and was about to advise the same link, but then I saw you had beaten me to it :-)
Nikolay Mishev
@NikolayMishev
Hi guys,
Can some one tell me if it is possible to open VS 2019 Create new project window from a commandline with opening specific templates. Currently we are using this command that works for VS2017(and older) devenv.exe /command "File.SelectProjectTemplate ^"<someTemplateName>^" N/A"" but this seems not to work for VS 2019 and I cannot find how to open the Create new project window with some specification either some search or the "language" "platform" "projectType" options?
Yann Duran
@yannduran

@NikolayMishev my guess is that when they redesigned the "New Project" dialog they think about it being used that way. it's been a common pattern - they replace something that works with "something new", and that something new doesn't have all of the previous functionality.

i suggest you add an issue using the "Report a Problem" (or Feedback) button in the top right of VS. that's supposedly the quickest way to get something looked at. even the VS team members who sometime hang out here will ask you to do that, before they can try to help

vdudas
@vdudas

Hi all, I'm trying to update one of our VS extensions and I'm getting

Install-Package : Could not install package 'Microsoft.ServiceHub.Analyzers 2.7.2466'. You are trying to install this package into a project that targets '.NETFramework,Version=v4.7.2', but the package does 
not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.
At line:1 char:1
+ Install-Package Microsoft.ServiceHub.Analyzers
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Install-Package], Exception
    + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand

However, the package doesn't say it requires any particular version of the .NET Framework. What am I missing?

2 replies
rossy62
@rossy62
Hi all,
My company ported a VS2013 extension for VS2019 and moved from C++ to C#, which is nice, but the new extension is a bit of a mess. I'm working on a work-around where I Uninstall/Disable the extension and supply new .targets/.xml files for the filetypes the extension managed. This seems promising.
BUT, I need to disable/uninstall the extension. Is there a way a project file or properties sheet can disable an enabled VSIX extension?
There is a case where the Extension trapped a build event and launched a second pass build. This case I will still require the extension to be enabled. So some projects in the solution will want the extension disabled, and some will not. Essentially I want build events from some projects not to be seen by the Extension.
At the moment the only way I see to do this would be to manually disable the Extension... Run the projects in the solution that work without it, then Enable the Extension and run the one case that may need it.
I'm looking into a way for MSBUILD to create two separate targets which will eliminate the two pass requirement but My MSBUILD-FU and even after I solve this, some projects may still want the extension and others not.
I'd rather not have to teach all my users how to turn on/off the extension and would like to automate that somehow.
We do have a disable flag or our extension, but one of the bugs is that it is not looking at flags for a multi project solution so it's broken.
Neil Henderson
@bluetarpmedia

We do have a disable flag or our extension, but one of the bugs is that it is not looking at flags for a multi project solution so it's broken.

I think this is where you should focus your efforts. Instead of disabling/enabling the VSIX extension in VS, it sounds better to use an internal flag to control whether your functionality is enabled or not.

Dan Vyskrebets
@osynavets
Hi everyone. I'm working on ssms extensions using vs sdk. Right now, I'm trying to open new tab using vs sdk.
When you just open ssms and click that 'new query' button, new window opens, but it's not tied to the specific file or something else. It's just new tab with opened editor that you can save as a file. I'm trying to do the same. Any help how can I do that ? The closest thing I came up with is using IVsUIShellOpenDocument interface, but it's not clear to me how exactly I can use it for my purpose. Thanks anyway.
tnblank77
@tnblank77
I invoke "Find in Files" searches from my Extension, but with the modernization in Visual Studio 2019 16.9.5 (https://devblogs.microsoft.com/visualstudio/modernizing-find-in-files), my Extension seems to still be using the old methods and not the new functionality. Does anyone know how I would go about updating my Extension to use it? I can't find any information anywhere but it appears that others have figured it out with some extensions like "Multiline Search and Replace". What I use now is what is exposed by EnvDTE80.DTE2.Find
1 reply
vasantha-kumar25
@vasantha-kumar25

Hi All, I have recently deployed the Extension to the target machine, using a custom installer instead of vsix. The Custom installer will Copy the extension to Common7\Ide\Extensions\OurProduct subfolder inside VS and then run denenv with the /updateconfiguration command line option so it can detect our extension.

The Installation is successful and The extension is working as expected. However, post installation, when the developer tries to Build the source code of the Extension, which in turn, deploy the vsix content to the experimental instance, any one of the below build errors are thrown.

1) The 'UninstallExtension' task failed unexpectedly
2) Extension '<productID> is of the same or lower version than the installed extension. Please make sure that the extension version is higher than that of the installed extension

Getting these error is general behaviour of VSIX ? Or Am I Missing any item? Any insight on why this occurs and how we can handle them? @RobertvanderHulst

James Vango
@vangojames
Hey! I don't know if this is the right place to ask about this but I am having some real issues with a package I am developing. Everything was working beautifully, until I added a reference to Microsoft.VisualStudio.VCCodeModel to the project. Now none of my breakpoints hit. Does anyone know what could be going on and how I can fix it? I have been trying for a while to get it sorted!
String.Empty
@A9G-Data-Droid
There seems to be an issue with the latest Microsoft.VisualStudio.SDK I am getting "Could not install package 'Microsoft.ServiceHub.Analyzers 2.7.345'. You are trying to install this package into a project that targets '.NETFramework,Version=v4.7.2','." which is odd because the SDK requires 4.7.2 and it won't install on any other framework. So it's impossible to install it at all.
If I install the older version 16.0.206 it works fine
Robert van der Hulst
@RobertvanderHulst
@vasantha-kumar25 During developent we always make sure that the version that we are debugging has a higher version number than the one that is installed. That way it will automatically replace the installed version when running in the experimental hive.
1 reply
Christopher Christou
@awschristou
Does anyone have xunit tests that exercise code that calls ThreadHelper.ThrowIfNotOnUIThread()? I'm not having consistent success in this space, and would be interested in hearing what others have set up for this.
Dotnetsafer
@dotnetsafer_twitter

Hi everyone, I don't usually use this platform, sorry if I do something wrong.

I'm trying to develop an extension that attacks visual studio build events.

My goal is, in the compilation event.

  1. Let the application compile.
  2. MODIFY x values ​​of the compiled application and replace it (in bin / release)
  3. Let him continue his march, that is, do deploy, do a nuget pack, whatever he should do.

I am using the build events from the DTE, exactly OnBuildProjConfigDone.

If I execute my point 2 there. It works, the problem is:

If I do it asynchronous:

public void BuildEvents_OnBuildProjConfigDone (string projectName, string projectConfig, string platform, string solutionConfig, bool success) { JoinableTaskFactory.RunAsync (async delegate { .... the code

Process 2. is executed asynchronously, that is, the compilation process would go to:

  1. Compile
  2. Does what it has to do
  3. Run my custom task (async).

If I don't do async, JoinableTaskFactory.Run, the Visual Studio interface hangs for several minutes until point 2 ends.

Is there a way to get the flow I need?

The specific question is, how can I make an event that does not freeze VS (aysnc, but that build stops until my process finishes) and is executed as soon as the application is compiled (before doing pack, deploy, build an apk if it is xamarin etc).
Dotnetsafer
@dotnetsafer_twitter
The code is https://github.com/dotnetsafer/Shield.VSIX/blob/master/ShieldVSExtensionPackage.cs#L296, that works, but of course it doesn't follow the flow.
If for example you do pack,
  1. Compile, 2. Pack. 3 Own function
    But the packaging does not contain the custom function.
Sajal Verma
@sajalverma17
It seems that not all UICONTEXT visibility constraints are recognized by .vsct files. I was able to set UICONTEXT_SolutionExists as a constraint and my command is only visible when solution exists in Visual Studio, but UICONTEXT_SolutionExistsAndFullyLoaded gives me a compilation error: Undefined 'context' attribute 'UICONTEXT_SolutionExistsAndFullyLoaded' in a <VisibilityItem> element.
Sajal Verma
@sajalverma17
The same UICONTEXT works when set on my VSPackage as a ProvideAutoLoad attribute, but not on a command in my VSPackage. The command is a context menu button for Solution Explorer items . Is there no way but to define a custom rule and set it active/inactive using SVSMoniterSelection service to mimic the UICONTEXT_SolutionExistsAndFullyLoaded?
Ranuka
@ranuka2
Hi everyone,
I need to display a custom glyph next to the debug breakpoint as in below image. I couldn't find a clear documentation on this area. Very much appreciate if you can point me to any references on addressing this.
image.png