You can have one assembly, but with multiple modules compiled in different languages. You would set up three projects:
- VB.NET-specific code project
- C# code project
- EXE project
Now, you can't use Visual Studio to build this (AFAIK, but you might be able to fiddle with the project files/MSBUILD tasks to do this), but you would use the command-line compilers to create netmodules.
Using csc.exe (for C#) you would use the /target:module
command-line parameter, while with vbc.exe (for VB.NET) you would also use the /target:module
command-line parameter.
Then, when building your EXE project, you would use the command-line compiler (depending on the language) and use the /addmodule:<module>
(assuming the EXE project is in C#) or the /addmodule:<module>
(assuming the EXE project is in VB.NET) to point to the modules that you specified to include in the EXE output assembly.
You also have the option of compiling everything into modules, and using the Assembly Linker (Al.exe) to produce an output assembly.
If the above option doesn't appeal to you, then another option is to pick one language and use that.
If you use VB.NET, then you will have exception filters (which you indicated is the piece you needed, which is a language feature, not exposed through the framework).
If you use C#, you don't have exception filters, but you can emulate them as indicated by George Duckett's answer.