It is perfectly well possible to create a method, class, struct, type or whatever in one .NET language that cannot be called by another directly. Calling it indirectly (by means of reflection, for instance) is always possible.
I.e., if you look at any compiled C# project, you'll see that the compiled code contains some code with weird names and characters in it, usually for supporting generics. One such name is <Module>
(including the brackets), which, even if it were made a public method, can never be called from C# directly.
Language designers that decide to compile for the CLR must support a minimal subset for public types. This is referred to as CLS Compliance and is about a common naming convention, no public pointers or public unsafe members or classes, no names that only differ by case, no public static fields and some more rules. When they obey to this rule it is guaranteed that any other .NET language can call your methods. They know how to do this, because the rules for this are well laid out and documented.
You can even create non-compliant C# code. It will (usually) compile, but it is not guaranteed that all compliant languages can call your method. The same is true for most other languages, including C++.NET. It is a Microsoft Design Guideline to mark your assemblies as CLSCompliant by default (whether it's written in C++, VB, Ruby doesn't matter).