ClickOnce[
^] probably does exactly what you are looking for. However if you looking to write something on your own, here's an idea.
In client server based windows application that runs within the organization network, you can perform updates using following logic.
1. There must be file containing name and version numbers of all your DLL files.
2. When client application starts, before anything else, it sends content of file in #1 to server. DLLs are loaded on demand so I would recommend doing this as step one.
3. Server will have a similar file but with latest version details.
4. Server will check for version mismatch and if
a. Versions are same, success flag is sent to client application to continue.
b. In case of version mismatch, server will then push the latest files to client system. This will require a user account with privileges across the network which is generally not an issue in organizations. Once files are pushed, server sends back notification to client application which can then restart if needed.
In case your application is deployed on client networks, #1 through 4a remain same. However, 4b would change as following.
4b. Server notifies that DLL files are outdated and prompts user to update. If user choses to upgrade, they can download the files from server to the installation directory. In this case end user must have required access on his computer.
If you are creating newer modules, there can be two ways to deal with this.
1. Provide updated installer file to users. This would be viable solution assuming the assembly that runs first is also changed.
2. If you have a plug and play architecture where starting assembly is not affected even if you are adding newer modules you can go with same approach as you would for updates.
P.S. Should we delete the comment chain?