From the standpoint of the runtime, there are not "projects". There are modules, assemblies and processes (normally, a process is created when you load an application). If different assemblies are used in a single application, so they are loaded in one single process during runtime, the boundaries between those assemblies do not virtually exist: you can freely do the calls between them as they were in one assembly.
In contrast, if you are working with separate processes, which are well isolated, you cannot share any data and makes calls across them. You have to use IPC. It includes sockets, named pipes, classical .NET remoting and WFC (internally using communication channels based on sockets and named pipes, but also different messaging systems, in case of WCF), shared memory (better avoid it by all means) and a lot more.
Please see:
http://en.wikipedia.org/wiki/Assembly_%28CLI%29[
^],
http://en.wikipedia.org/wiki/Process_%28computing%29[
^],
http://en.wikipedia.org/wiki/Inter-process_communication[
^].
—SA