This depends on whether you mean any arbitrary application, without any coding changes or support within the applications themselves? Or do you mean a suite of applications that are custom coded to cooperate with the monitoring system you are building.
In the latter case I would add a remoting channel to the applications, that a monitoring system could connect to on a regular basis, (functionally like a ping) and with a generic GetStatus() method that would report appropriate health stats to the monitoring system... I would add this functionality as a separate dependant assembly to each app I wanted to monitor...
In the first case, I believe you will need to hook into OS APIs, especially to communicate with OS's running on other machines on the network (if that is also a requirement) As You mentioned .Net I assume you are talking WIn32 Machines only. I do not know what fuinctionality is exposed by the WIn32 API in this area.