As already mentioned, you can simply right-click your solution in the solution explorer, select Add> Existing Project and view the overall project .csproj file and it will be included in the solution from its original location.
There are two problems with this, but it may or may not be a problem, depending on the size of your team:
1 - a common project will be included in each solution with a relative path to the solution file (IE: ... \ CommonProject \ Common.csproj). This means that all developers must have the same working file structure or they will get errors when trying to open the main project.
2 - In the scenario, the general project refers to several projects (say, two - A and B), and the developer working on project A must make changes to the general project as part of his task. The developer will not be able to find out if the changes made by them will violate project B without actually checking project B and compiling it. As more and more projects refer to a common project, the risk of this event increases to such an extent that it becomes unmanageable.
Again, as others have said, there is no “right” way to do this, however, the approach I did is as follows:
1 - Use continuous integration, such as Cruise Control, to manage the construction of projects and put the overall project as a separate project on the server.
2 - Create a directory under your source code to create built-in shared DLLs. Select this directory on your build machine and whenever a shared project is created, it copies the output DLL to the DLL folder and commits these changes to the original control.
3 - Use environment variables on all development machines and the build server to control the location of the shared DLL folder and reference the DLL using this variable, and not the hard-coded path. (IE: instead of C: \ Source \ MyCommonProjectDLLS \ Common.dll, use $ (MyCommonLocation) \ Common.dll with the variable "MyCommonLocation" set to C: \ Source \ MyCommonProjectDLLS)
4 - For any project that refers to a shared DLL, configure the CI trigger on the build server for this project to view the shared DLL folder. Whenever changes are tied to it, the build server must then build all consuming projects.
This immediately lets you know if you are committing a change violation for any other project. The only drawback is that in this model consuming projects force updates to be shared into the common DLL as soon as they are created. An alternative is the version of the Common DLL from the revision of the source code when it is created and the placement of each version in its own subdirectory in the shared folder DLL. So you get:
Common DLLs
-1.0.0.1234
-1.0.0.1235
-1.0.0.1236
Etc. The advantage of this is that each project can then choose when to accept updates to the common DLL, simply referring to the new version of the code. However, this shortens both ways, as it may mean that some projects stay with older versions of the common code longer than they should, which may increase the work when it comes time to make these changes.
Hope this helps.