Datasocket:
If you want your customer to be able to develope applications around your code, you're right that the disadvantage of Datasocket is that they need some NI software. NI Component Works provides an ActiveX interface to Datasocket, so with Component Works they can develope code in any language that supports ActiveX. But first they have to buy Component Works.
TCP:
On a single machine, you can use the local loopback address of 127.0.0.1. You don't need two NIC's cabled together. Using the local loopback address of 127.0.0.1, the data doesn't even go out to the network. You can 127.0.0.1 without being connected to the network.
ActiveX:
If you create an ActiveX server, you can set the distribution kit to register it as it installs it. Any software that can talk ActiveX (CVI, LabView, Visual C++, Visual BASIC, etc....) can be used to develope an application accessing your ActiveX properties and methods.
ActiveX servers can be remote from the client. (Sometimes called a remote COM object). I don't know the details of creating and registering a remote ActiveX server.
EXE/DLL:
A DLL can have a user interface based on a UIR. You just create and export a function to LoadPanelEx (instead of LoadPanel: see the help for both), DisplayPanel, RunUserInterface, and QuitUserInterface and call that function from your EXE. I name that function InitUIForDLL. If you want both programs (yours and your customers) running independently, you can create a very small EXE that basically just calls InitUIForDLL. Your customer then won't need to call InitUIForDLL but will have access to any other exported function.
The DLL can be remote from the EXE, but it will have to be on a network drive that the customer's application can map to.