Assembly is used very little and only if it can't be done at a higher level or speed is needed. It's like re-inventing the wheel. Depending on the language, assembly is 100 to 500 times more code.
In Windows programming, normally the lowest level the programmer will want to go is the Windows API level using C++, VB, VB .net, C# .net, etc.
Learning any of the .net languages (VB .net and C# .net) is a good thing. The .net languages (also called the .net framework) include thousands of namespaces. Namespaces are libraries which are higher level then the API's. Programming with the .net framework, high level and low level can be mixed. Generally you want to program at the highest level possible. The advantage of high level is less code, faster development time, proven methods, etc. The disadvantage of high level is using libraries that may contain bugs, overhead, user downloading external programs (DirectX), or the library doesn't have the exact functionality that you want.
If there is something that can't be done a high level, then use the Windows API. Choosing VB or C# (pronounced C Sharp) is a matter of personnel preference. The syntax is different. I have only found one difference and that is VB doesn't use pointers. VB has an interop pointer but not the real thing.
During development of ProScan, I was experimenting with changing a bitmap color and to get the speed I needed, I had to use a pointer so I made a C# .dll file and called the procedure from VB .net
To answer your question. ProScan is developed with vb .net using aprox. 100 windows API for the low level audio (waveIn/waveOut), wave file write (mmio) and various miscellaneous things that couldn't be done at a higher level. The .net framework 2.0 and above contains a serial port class and all modern languages have excellent data-file parsing.