As I think you know, there are a number of choices available. Depending on your requirements, you might exchange XML or other content via HTTP ("web services", "SOAP"), or use a true distributed object system like CORBA, or some kind of messaging middleware. Which you choose would depend on what expertise you (or your team-mates) have, and whether the C# and Java components are really peers, or instead one has to pull or broadcast information while the other serves or receives it.