When the service fails to start, does it happen immediately or after the full 30 second timeout on the start request?
After 30 seconds
This usually means that your service .exe isn't crashing, but rather that it is "hanging". Often this is a permissions issue or, with applications that use networking, a port issue of some type (binding, firewall, etc.).
Have you tried to run your code as a stand-alone foreground application?
Works perfectly as a non-service standalone GUI
It works perfectly on the same machine where it doesn't work as a service? Even if does, when running on the desktop, it's running in the security context of the logged-on account (you said "administrator"). When running as a service, the security context is the LocalSystem account. Have you tried changing the service to run under a specific account, such as Administrator?
If it does happen to run as as service when the service is set to run on the Administrator account, then you'll know it's a permissions issue.
However, regardless of the above, and as Danijel suggests in his reply, the next step is logging to find out exactly where the service hangs. This should help you correct permission or port issues.