We will be using the BeatSaberModdingTools extension in this tutorial, as it comes with modding templates and useful features. BeatSaberModdingTools is maintained by Zingabopp. If you find the tools to be useful, consider throwing some support their way.
You can download it on their GitHub. You will need to download BeatSaberModdingTools.vsix. (Expand the Assets dropdown if you cannot find it)
Once downloaded, open the .vsix and it will install itself as a Visual Studio Plugin. If you have any issues, consult the project's README and WIKI.
First, create a new project using the template. We are going to use the BSIPA4 Plugin (Core) template, and we'll be calling our mod BSPlugin1. You should change the name to whatever you want to call your mod.
You will then need to set your Beat Saber Directory in Visual Studio. Follow the instructions on the template readme, or see the screenshot below.
At this point, try and build the project, and it should automatically find the references for you and the build should succeed.
If your build does not succeed, check that you don't have any missing references.
Build your plugin with Build -> Build Solution or CTRL + SHIFT + B Your compiled DLL should automatically be copied to the Plugins folder in your Beat Saber directory! This will be done for both debug and release builds.
When you are ready to release your mod, select the Release option to make a Release build of your mod.
Building in Release mode will generate a packaged .zip file ready to upload to BeatMods.
To test if your mod is loaded in-game, you will need to launch Beat Saber with the BSIPA Console enabled. Add --verbose as a launch argument and run the game. For more information on launch arguments, see here.
When you launch the game, you should see BSIPA load your mod in the console window.
If you need to patch the game's code for your mod, you should use Harmony. The 0Harmony.dll is already installed for modded games.
For experienced developers, you may be interested in learning about Zenject, the Dependency Injection system used heavily by Beat Saber. SiraUtil is a library that allows you to easily hook into this system.