Note: This is not a specific to C#.NET post, it is more general software (maybe the mods will move it to software development forum)
well, if the client has internet access, you could set it up that each copy has a unique id, after install it sends this ID to a server, the server makes a time stamp, then each time the program is launched the server checks against that time stamp, and sends a response. If the application doesn't recieve the appropriate response, it simple closes and shows a "buy now" or whatever.
another option would be an encrypted .dat file or such which is created on the client machine when the application is installed and is accessed on each run of the application where it compares the dates and then performes a similiar actions to above. Of course if the user would delete this file, it might cause problems...
But to be honest with you, the level of the current hacking tools (there are so many) makes it so basic to crack a program that you need to do some real smart programming like checking that the dates dont change while the app is running (if they do then someone is using something similiar to a trainer to keep the expiary date from arriving).
A really determined user might also just keep setting their system time and thus prevent the expiary date from arriving. perhaps you should look into using some sort of counter where the user may launch the application for x times before it expires (agian can be hacked, also the stand-by funciton of windows could thwart this mechanism) so then you would also have to see how long the applicaiton has been running (like 20 hours or so then close the app and force a re-open of the application).
In general this is an issue with software, something i have tried (unseccesfully) several times to achieve, but there is always a way to crack software, which is sad because my landlord doesn't allow me the 'crack' the rent mechanism...