Dunno exactly what constitutes a "project" in your context, but have a look at desktop bookmarks, with Bookmark+.
An Emacs desktop records (and subsequently restores) the kinds of thing you mention: frames, windows, buffers (open files etc.), variable values,... With only vanilla Emacs, people tend to use only a single desktop, and they use it only to save the final state of an Emacs session and restore then that state when the next session starts.
But with Bookmark+, you can easily switch among any number of desktops, just by "jumping" to desktop bookmarks.
Command bmkp-set-desktop-bookmark
(bound by default to K
on the bookmark keymap, which is by default on prefix key C-x p
(so C-x p K
), saves the current Emacs state in a desktop bookmark (or updates an existing such bookmark).
Command bmk-desktop-jump
, bound by default to K
on the bookmark jump keymap, which is by default on prefix key C-x j
(so C-x j K
), prompts you for a desktop bookmark name (with completion), and jumps to the one you choose, which means that it switches Emacs to that desktop.
Command bmkp-cycle-desktop
(not bound by default) cycles through your desktop bookmarks.