Namespaces have nothing to do with importing or accessibility of types. "Projects" have nothing to do with accessibility of types.
Everything happens at the level of assemblies. Project is just source code which is compiled into assembly. If you have two assemblies, one can reference another one; it means that its name (or
strong name) is mentioned in the PE file of referencing assembly. When some assembly is referenced, its
public
declarations (types and members, but also
protected
for members) become exactly as accessible as accessible as if they were in the same assembly.
This is information on using assemblies (and namespaces):
http://msdn.microsoft.com/en-us/library/ms973231.aspx[
^].
Many beginners asked questions about namespace wondering that
using
declarations cannot help to use assemblies. Maybe something is not so well explained in MSDN; just read it more carefully. You don't really need
using
; it is written just for convenience and shorthand naming; it you always used full type names, you could develop without
using
. This is just for naming of top-level types: they can have identical simple name and still differentiated by fully-qualified names.
Now, if you put all related projects to the same solution (highly recommended), you can reference by projects, using the tab "Projects" of the window "Add Reference". Even though ultimately the reference is done by the name of the
main executable module of the referenced assembly (most typically, *.DLL, but it always can be *.EXE or any other file with .NET assembly manifest). This approach greatly improves development process, by a number of reasons.
You can get an idea about modules and there role in .NET here:
http://msdn.microsoft.com/en-us/library/168k2ah5%28v=vs.110%29.aspx[
^],
http://msdn.microsoft.com/en-us/library/7d3c18c2%28v=vs.110%29.aspx[
^].
—SA