You are implicitly assuming that .NET is exhibiting the correct behaviour.
FTN95.chm notes (under .NET programs / .NET programming / Arithmetic overflow/underflow) that 'Floating point underflow, which (depending on the algorithm) may or may not represent a true error, can optionally be trapped.' (in .NET. It is always trapped in Win32.) I suggest that if your code does not set it up to be trapped, it probably isn't! Hence, the Win32 version is probably giving you a better handle on the problem.
Single precision underflow does happen at about 10-38, and if you are dealing with numbers that close to zero, you really ought to go for 64-bit reals, or even better, 80-bit reals (which are Win32 only). John Campbell's suggestions are the first steps in tracking your problem down. 64-bit reals will get you down to more like 10-308, and 80-bit reals down to about 10^-4932 (see in FTN95.chm the section kind parameters for intrinsic types / real kinds).
I always found that one has to be VERY careful with real4, and that real8 is often too precise. Real6 seems to me a suitable compromise for routine work. Real10 is for the sort of work you seem to be doing.
Best regards
Eddie