The disadvantages of using EXE is so serious that you should avoid this option by all means. "Solution" #1 provides the worst advice. It means separate processes, and processes are highly isolated. The only benefit of using EXE is the simplicity of the use of some simple 3rd-party utilities (usually console-only) via a command line, but this is not your case.
You can have pure CLI code, or you can use native code in managed by using P/Invoke:
http://en.wikipedia.org/wiki/P/invoke[
^],
http://www.xinterop.com[
^].
This CodeProject article can also be useful:
http://www.codeproject.com/csharp/EssentialPInvoke.asp[
^].
Another option is using C++/CLI. You can create a mixed-mode project (managed+unmanaged). From the CLR standpoint, this is a regular .NET assembly which can be use normally by other assemblies. At the same time, it can contain unmanaged code which you can wrap in "ref" CLI classes to expose them to .NET.
—SA