VisualStudio
This page contains notes about Visual Studio, the Microsoft IDE for writing applications for Windows desktop and mobile devices. Obviously the information on this page is bound to become out of date over time as Visual Studio is a bit of a moving target.
Configuration
This section has some details about how I like to configure Visual Studio (under Tools > Options):
- Environment
- General
- Turn off upper case in menu bar = true
- Fonts and Colors
- Font size = Set depending on monitor / resolution. On my Apple monitor at home I like to set this to 16.
- Startup
- At startup = Show empty environment
- Tabs and Windows
- Preview selected files in Solution Explorer = false
- Preview selected files in Find Results = false
- Allow new files to be opened in the preview tab = False
- General
- Projects and Solutions
- General
- Track Active Item in Solution Explorer = False
- Build and Run
- Number of parallel project builds = Set to the number of cores in the environment
- General
- Source Control > Visual Studio Team Foundation Server
- Get latest version of item on check out = False
- Setting this to False is very important!!! If this is left to True, the "getlatest" operation will invariably get a version of the file that is inconsistent with the rest of the project or solution
- Open Source Control Explorer to the most recent folder = true
- Prompt before check-in from Pending Changes window = True
- Resolve associated work items on check-in = False
- I set this to false because I frequently check in several changes for a single work item, so I want to be in control of when the work item is resolved.
- Get latest version of item on check out = False
- Debugging > General
- Step over properties and operators = False
- Highlight entire source line = True
- Text editor
- All Languages
- General
- Line numbers = true
- Tabs
- Indenting = Smart
- Tab size = 4
- Indent size = 4
- Keep tabs = true
- C/C++
- Advanced > Use Forward Slash in #include Auto Complete = True
- Formatting > General > Automatic indent when I type a tab = True
- Formatting > Indentation > Indent case labels = True
- General
- All Languages
Unfortunately the text editor tab settings are global, which means that you will get into trouble when you work on different projects with different code formatting guidelines. Because the tab settings are cloud-synchronized, you will have trouble even if you develop on different machines.
Keyboard shortcuts
Configure keyboard shortcuts under "Tools > Options > Environment > Keyboard". Use the "Global" context unless specified otherwise.
- Ctrl + Shift + B = Build Solution (already the default in VisualStudio 2019)
- Ctrl + B, Ctrl + B = Build.BuildSelection (the default shortcut is Ctrl + B, and I would actually prefer the default, the problem is that it does not work because there are many chords that begin with Ctrl + B)
- Ctrl + T = TestExplorer.ShowTestExplorer (by default Ctrl + T is assigned to Edit.CharTranspose (in Text Editor); this function has so little value that it is safe to reassign the shortcut)
- Compare with latest version
- Visual Studio 2010: Ctrl + Shift + D = TeamFoundationContextMenus.SourceControlPendingChangesSourceFiles.Compare.TfsContextPendingCheckinsCompareWithLatestVersion
- Visual Studio 2013: Ctrl + Shift + D = TeamFoundationContextMenus.PendingChangesPageChangestoInclude.TfsContextPendingChangesPageCompareWithWorkspaceVersion
- With Git: Ctrl + Shift + D = Team.Git.CompareWithUnmodified
- With TFS: Shift + Enter (already the default in VisualStudio 2019, possibly works in Pending Changes view only)
- Alt + O = EditorContextMenus.CodeWindow.GoToHeaderFile (in "Text Editor" context)
- With CodeMaid: CodeMaid.SwitchFile (in "Text Editor" context)
- Ctrl + Num 1 = View.FindResults1
- Ctrl + Num 2 = View.FindResults2
- Pending Changes
- With Git: Ctrl + Num 3 = View.PendingChanges
- With TFS: Ctrl + Alt + Num 3 = View.TfsPendingChanges
- Ctrl + Num 4 = View.Output
- Ctrl + Num 5 = View.ErrorList
- View History
- With Git: Ctrl + Num 6 = Team.Git.ViewHistory
- With TFS: Ctrl + Alt + Num 6 = File.TfsHistory
- Annotate
- With Git: Ctrl + Num 7 = Team.Git.Annotate
- With TFS: Ctrl + Alt + Num 7 = File.TfsAnnotate
- Ctrl + Num 8 = View.QuickAccess (available only when the "Quick Access" extension from the "Productivity Power Tools" extension pack is installed)
- Ctrl + Num 9 = View.SolutionExplorer
- Ctrl + Num / = Team.GotoWorkItem
- Ctrl + Num * = TeamFoundationContextMenus.Commands.GoToBuilds
- Ctrl + Num - = File.TfsContextExplorerMerge
- Ctrl + , Ctrl + L = Edit.Trimlineends
- Alt + U = Edit.GoToFile (stolen from the extension DPack)
Useful default keyboard shortcuts:
- Ctrl + F12 = Edit.GoToDeclaration
Toolbar
- Create a new toolbar
- Name = "foo"
- Add buttons for the following commands:
- View > TfsSourceControlExplorer
- File > TfsWorkspaces
Test settings
- Test > Windows > Test Explorer > Run Tests After Build (unfortunately you have to manually switch to the Test Explorer view to see if any tests failed; with a keyboard shortcut this switch can be made so quickly that, in time, the check hopefully becomes second nature)
Configure alternative Compare/Merge tools
It's possible to replace Visual Studio's default Diff/Merge tool (diffmerge.exe
) with alternative external tools. My personal preference for the Diff tool is WinMerge, but I haven't found a viable alternative for the Merge Tool.
General:
- Source control tools are configured here: Tools > Options > Source Control > Visual Studio Team Foundation Server -> Configure Users Tools..
- Here is a blog post on msdn.com with an overview of many different tools and how to configure them: http://blogs.msdn.com/b/jmanning/archive/2006/02/20/diff-merge-configuration-in-team-foundation-common-command-and-argument-values.aspx
- WinMerge article:
- Blog post: http://www.neovolve.com/post/2007/06/19/using-winmerge-with-tfs.aspx
- Command line reference: http://manual.winmerge.org/Command_line.html
Use WinMerge as compare tool
- Extension = .*
- Operation = Compare
- Command = C:\Program Files\WinMerge\WinMergeU.exe
- Arguments = /x /e /u /wl /dl %6 /dr %7 %1 %2
- /x = Display an info dialog when identical files are compared, then close WinMerge automatically
- /e = Close with Escape
- /u = Don't add files to MRU list
- /wl = Left side is read-only
- /dl %6, /dr %7 = Displays %6 and %7 as descriptions on the left/right pane
- Note: "Ignore whitespace" cannot be specified as a command line argument, the function must be enabled in the WinMerge options (Edit > Options > Compare > Whitespace = Ignore change)
The default compare tool (diffmerge.exe), but with "ignore whitespace"
- Extension = .*
- Operation = Compare
- Command = C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\diffmerge.exe
- Arguments = %1 %2 %6 %7 %5 /ignorespace
Use WinMerge as merge tool (not recommended)
- Extension = .*
- Operation = Merge
- Command = C:\Program Files (x86)\WinMerge\WinMergeU.exe
- Arguments = /x /e /u /wl /dl %6 /dr %7 %1 %2 %4
Extensions
- Productivity Power Tools
- This is actually a collection of extensions. After the main extension is installed, the individual extensions can be enabled/disabled here: Tools > Options > Productivity Power Tools
- Over time many of the most useful functions have been integrated into Visual Studio. Useful functions that are still part of the extension: Fix Mixed Tabs, Edit Project File (opens the .csproj or .vcxproj in the text editor).
- DPack
- The single interesting feature of this extension is that with shortcut Alt + U you open a small window that lets you quickly open any file in the solution simply by entering its name, or a partial name. You don't have to navigate to the file via Solution Explorer.
- Since Visual Studio 2013 the Solution Explorer also has a search function, but I find this pretty unusable, so I still use this extension.
- Configuration: Solution Backup > General > Backup the entire solution = false
- Editor Guidelines
- There may be several extensions of the same name, I am using the one by Paul Harrington.
- I use this to show a vertical guideline in the text editor at column 80, so that I can immediately see when the line I'm writing gets too long.
- To set a guideline, place the cursor in the editor in the desired column, then open the context menu and select the appropriate entry.
- AnkhSVN
- If AnkhSVN should be the default Source Control system
- Go to "Tools > Options > Source Control > Plug-in Selection"
- Select AnkhSVN
- If AnkhSVN should only be used on a per-project basis
- Select "File > Subversion > Change Source Control"
- If AnkhSVN should be the default Source Control system
Team Foundation Server Power Tools
Search for this in the dialog where you manage Visual Studio's extensions. Downloading this does not install a Visual Studio extension, though, but an installer for a standalone software package.
This software package no longer exists since Visual Studio 1017. With the exception of the TFS shell integration in Windows Explorer all features are now part of Visual Studio.
Git and Visual Studio
General information about Git
For the general usage of Git, see this wiki page.
Git integration in Visual Studio
In Visual Studio 2012 you have to install the extension "Visual Studio Tools for Git": https://visualstudiogallery.msdn.microsoft.com/abafc7d6-dcaa-40f4-8a5e-d6724bdb980c
Since Visual Studio 2013 this extension is already integrated in Visual Studio.
Important: As mentioned in this StackOverflow answer there exist two external solutions besides the Git SCM provider that is integrated into Visual Studio: "Git Extensions" and "Git Source Control Provider". The following sections on this wiki page do not discuss these external solutions. This is especially important for when you research solutions to problems with the underlying Git configuration, e.g. when you have to fiddle with .gitconfig
. The external solutions and the integrated Git SCM provider sometimes have subtle differences in this regard.
Paths
The global .gitconfig
file is located here:
C:\Users\<username>\.gitconfig
The base folder that is used by default to store repositories is located here:
C:\Users\<username>\Source\Repos
Keyboard shortcuts
Keyboard shortcuts are configured under "Tools > Options > Environment > Keyboard". Unless noted otherwise you can use the "Global" context. Unfortunately I have not found a context that is specific to Git, which would prevent conflicts with the shortcuts defined for the TFS SCM provider. Because of this, I have chosen the following shortcuts so that they are similar to the TFS shortcuts, but mostly use an additional Alt key.
- Ctrl + Alt + D = Team.Git.CompareWithUnmodified
- Ctrl + Alt + Num 3 = Team.Git.GoToGitChanges
- Ctrl + Alt + Num 6 = Team.Git.ViewHistory
- Ctrl + Alt + Num 9 = Team.Git.Annotate
Potentially useful but not yet customized shortcuts:
- Ctrl + 0, O = Team.Git.GoToGitCommits
- Ctrl + 0, N = Team.Git.GoToGitBranches
Clone a repository
- In the menu select the enry "Team > Connect to Team Foundation Server..."
- In the window that now opens there is a section at the bottom titled "Local Git Repositories"
- In this section, click the link "Clone"
- In the first field you enter the clone URL. You get the clone URL at the upstream source from where you want to clone the repository. Examples:
- GitHub: https://github.com/herzbube/Orc.Wizard.git
- Visual Studio Team Services: https://herzbube.visualstudio.com/DefaultCollection/_git/My%20First%20Project
- In the second field you enter the local path where you want to store the cloned repository. Usually the default value should be OK. Examples:
- C:\Users\<username>\Source\Repos\Orc.Wizard
- C:\Users\<username>\Source\Repos\My First Project
Configure user information
After cloning the first repository you should immediately configure your user information, so that commits will be created with the correct information.
- Select "Team > Connect to Team Foundation Server > Git Repository"
- Click the button "Settings"
- Click the link "Git Settings"
- User Name = Patrick Näf
- Email Address = herzbube@herzbube.ch
These settings are now valid for all repositories.
Note: As is usual for Git, the information is stored in the global .gitconfig
file. This means that you can also do the configuration via command line (git config ...
) or in a text editor.
Remove local repository
- Select "Team > Connect to Team Foundation Server"
- Righ-click the repository to remove
- Select "Remove" from the context menu
- If the context menu entry is disabled you have to switch to a different repository first because, apparently, it is not possible to remove the project that is currently active.
Note: The repository still exists on the hard disk, it is just not visible in Visual Studio anymore. If you want to completely delete the repository you have to do so in Windows Explorer. Usually repositories are located below your home directory, e.g. C:\Users\<username>\Source\Repos
.
Install and use command line tools
Visual Studio offers to install the Git command line tools:
- Select "Team > Connect to Team Foundation Server"
- Double-click one of the local repositories
- In the upper part of the view you should now see the following offer: "Install 3rd-party Git command prompt tools"
- Click the "Install" link
- This downloads an installer that you have to execute manually (msysgitvs.exe)
- The setup process is pretty straightforward, so no further explanations here
To use Git on the command line:
- Select "Team > Connect to Team Foundation Server"
- Double-click one of the local repositories
- Click the "Changes" button at the top
- Open the "Actions" dropdown menu
- Select the menu entry "Open Command Prompt"
A DOS command prompt now opens, with the current working directory set to the project repository path. Here you can use the usual Git commands.
Configure WinMerge as Diff tool for Git
Visual Studio does not offer a GUI for configuring a non-default Diff tool for Git. You have to configure this manually by editing the global .gitconfig
file.
[diff] tool = winmerge [difftool "winmerge"] cmd = \"C:/Program Files (x86)/WinMerge/WinMergeU.exe\" \"$LOCAL\" \"$REMOTE\"
Important:
- You have to reproduce the combination of backslashes and quotation marks exactly as given here, otherwise paths that contain spaces will not work.
- You have to use the key "tool" in the "[diff]" section - not "guitool" (many guides on the web erroneously say it's "guitool")
GitHub PR handling
PR = Pull Request
Create a pull request:
- Create a new local branch: pr/branch-name
- Obviously the branch name should be related to the purpose of the PR
- The PR branch must be split off whichever branch you want the changes to be integrated in. Typical branches: master, develop
- Switch to the PR branch
- Implement the changes
- Publish the PR branch to GitHub (= push the branch)
- Navigate to GitHub in the browser and create the PR
- GitHub docs: https://help.github.com/articles/creating-a-pull-request/
Manage PR:
- The upstream maintainer will review the PR. Be prepared to answer questions and/or make additional modifications
- You can simply implement further changes locally, then push them - as long as the changes occur on the PR branch, GitHub is smart enough to automatically add the new commits to the PR
Once the upstream maintainer has accepted the PR, you can delete the PR branch. You also need to sync your cloned repo with upstream. You can't do this from the GitHub web interface, instead you have to use the command line:
cd /path/to/local-repo git fetch upstream git checkout master # or whatever branch was the base for the PR branch git merge upstream/master # ditto git push
Visual C++ projects
See the VC++ page.
Microsoft.NET projects
See the Microsoft.NET page.
Team Foundation Server
See the TFS page.
Resharper
Useful keyboard shortcuts:
- Shift + Alt + L = ReShareper.ReSharper_LocateInSolutionOrAssemblyExplorer
- This seems to be pretty much the same as SolutionExplorer.SyncWithActiveDocument, which by default is bound to Ctrl + ', Ctrl + S
Obtaining a customer system/disk image
Before creating the image
Before the customer creates the system/disk image she should create a temporary local user account - preferrably with administrator rights. The customer should then communicate the temporary account's password to you. The customer should also verify that the problem can be reproduced with the temporary account. After she has created the system/disk image the customer can delete the temporary account.
In adddition you need the following information from the customer:
- BIOS type (EFI, UEFI, ...)
- Operating system version (Windows 7, Windows 8, ...)
- Operating system platform (32-bit, 64-bit)
- Hard disk size
Create a system image
Since Windows Vista there is a function integrated in Windows that allows the user to easily create a system image:
- Launch the control panel
- Select "Backup and restore" (German: "Sichern und Wiederherstellen")
- Select "Create a system image" (German: "Systemabbild erstellen")
- Save the system image to an external hard disk (or whatever is convenient to transfer the image to you)
Create a disk image
Instead of a system image it is also possible to create the image of hard disk. The simplest method is to use the tool disk2vhd
. This tool is part of the well-known Sysinternals program suite, but it's also possible to download it standalone: http://technet.microsoft.com/en-us/sysinternals/ee656415.aspx.
The tool is very simple to use, and it's sufficiently clever so that you can create the disk image while the system is running! Usually you can simply run the tool with the default settings. The only thing to make sure is that the target disk image format is .vhd
, not .vhdx
, because converting to .vmdk
(see next section) is more difficult for .vhdx
. The setting with which you choose the target format is a checkbox labelled "Use Vhdx" in the tool's main window - you have to de-select this checkbox.
.vhdx
is a newer format than .vhd
: http://technet.microsoft.com/en-us/library/hh831446.aspx
Converting the disk image
Currently I know of 2 tools that can convert a disk image from .vhd
or .vhdx
into the .vmdk
format. The .vmdk
format is necessary so that the image can be used in VMware.
- WinImage: Can only convert
.vhd
. This is shareware that probably stops working after 30 days. - StarWind Image Converter. Can convert both
.vhd
and.vhdx
. For converting from.vhdx
the tool must be started on Windows 8. This is freeware, but you have to register to be able to download it.
Use .vhd/.vhdx without conversion
Disk images using the format .vhd
or .vhdx
apparently can be used without conversion like this:
- VirtualBox: An alternative virtualizing software. This is free / open source and can directly use
.vhd
or.vhdx
images. - Windows 8 and newer apparently can be configured so that Hyper-V virtual machines can be executed natively. Because
.vhd
and.vhdx
are the native Hyper-V Disk Image Format, it might be possible to use customer disk images without conversion. I have never done this and also have not yet researched this option.
Make a disk image bootable
If the disk image is not bootable, for any reason, it can be made bootable again like this:
- Mount the ISO image of an original Windows CD
- Launch the virtual machine that uses the problematic disk image
- The virtual machine should now boot from the Windows CD. After selecting the installation language you should be offered various repair options. Select the one that fixes problems when booting Windows. The options are labelled differently for each Windows version, so no details here.
- If that does not help, you can select the option that opens a console (cmd.exe) and then enter these commands:
Bootrec.exe /FixMbr Bootrec.exe /FixBoot
Restore a system image
If the customer has created a system image, it can be restored like this:
- Create a new virtual machine in VMware. The virtual machine must have the same properties that the customer gave you (Windows version and platform, disk size, BBIOS type).
- Configure th virtual machine so that the ISO image of the matching original Windows CS is mounted
- Boot from the CD
- Use the recovery optios to restore the system image