ClickOnce is an option, but not necessarily the most popular. You can also roll-your-own solution, which really isn't that hard:
- Create a URL on a web server which returns the latest version (as a JSON object, XML string, plain text, whatever).
- Have your program query this URL at startup.
- If the latest version doesn't match the current version, prompt the user and download the latest version from the web server, saving it to a temporary directory.
- Invoke the downloaded installer. (If it's an msi, there are command line options for "silent install" without a user interface; other installer have similar features.)
This approach has nothing to do with Visual Studio and could be used with any language / IDE.