Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
Yann Duran
@yannduran
@mrlacey what about a Source Generator instead?
Yann Duran
@yannduran
@yacoubmassad_gitlab have a look at how the Visual Studio Community Toolkit handles multiple versions of VS
Christopher Christou
@awschristou
Are there any issues for an extension that supports VS 2017 (15.0, 16.0] to target .NET Framework 4.6.1, or is it a requirement to target .NET Framework 4.6?
1 reply
Авдеев Вячеслав
@lsoft
yesterday Mads explained we will need to transfer the code of VSIX to a shared lib and add that files as a links to support both 2019+2022; if you have hundreds files you will probably need a few antidepressants to do that manually)) looks like we need a new VSIX to automate a working with shared libs + "linked" files))
Neil Henderson
@bluetarpmedia
@lsoft You don't need to add links to code files (e.g. .cs). Just drag your code files into the shared lib to copy/move it there, and remove from the original VSIX project. Then add a reference to the shared project from your VSIX project(s). Mads demo'd adding links to resource (Icon.png) files that are in the shared lib, but if you prefer you could also duplicate those files in each VSIX project.
Yacoub Massad
@yacoubmassad_gitlab
Thanks @yannduran

Based on this: https://devblogs.microsoft.com/visualstudio/async-loaded-net-projects-may-impact-visual-studio-extensions/

For some VS versions, Workspace.CurrentSolution will return an incomplete code model. (Partial Load Mode (PLM))

This is a new feature to enable faster loading of solutions.

In such versions, if we want to wait for the solution to "really load", we have to use IVsOperationProgressStatusService.

Also, based on this: https://github.com/microsoft/VSSDK-Extensibility-Samples/blob/master/OperationProgress/OperationProgress/OperationProgressPackage.cs

The API to get a IVsOperationProgressStatusService differs between VS 16.1 and "Post Visual Studio 2019 Update 2".

If I am to create a VS extension that targets VS 2017 and VS 2019 (multiple versions), how can I have a single VSIX for all versions?

If VS version > some version, I need to use IVsOperationProgressStatusService. And to get IVsOperationProgressStatusService I need to use different codes based on the version.

Or should I have three VSIX projects:

  1. For all VS versions before Partial Load Mode (PLM).
  2. For VS 16.1.
  3. For "Post Visual Studio 2019 Update 2".

?

@yannduran , the solution you suggested is based on compile time constants, does that mean I need multiple VSIX packages?
Yacoub Massad
@yacoubmassad_gitlab
Hello. Is IAsyncQuickInfoSource.GetQuickInfoItemAsync allowed to return null? This is not documented.
Авдеев Вячеслав
@lsoft
I am wondering what's the reason to support 16.1 if the user can updates to 16.latest with no costs?
Yacoub Massad
@yacoubmassad_gitlab
@lsoft , do you mean I shouldn't support 16.1?
Авдеев Вячеслав
@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