Agreed. To start C# program, just exec() it. A C# program is just another executable.
To communicate with an already running program, web-services is an option, but so are files, network sockets, and any form of IPC.
And finally, to call a function that was written in C# (or any .NET library function) from Java, you can use JNI. However, all JNI will do is get you to C/C++, or in Microsoft speak, to Unmanaged C++ -- you will need to write a simple Managed C++ object that can forward request from the unmanaged side to the .NET library.