The COM contract stipulates that interface definitions are immutable (no change to method names, argument lists, order of methods, number of methods), but that implementations can be freely altered. Naive, but true. (VB Binary compatibility will not permit you to change the method signatures or method order in an interface, although it will allow you to append new methods to it--go figure). Nevertheless, making any change to an interface or its methods for a DLL that is in production is "worst practice", as years of DLL Hell have borne out and as Hans has explained.
One approach for preserving binary compatibility through version changes is to add new interfaces to the component, and never (never ever) touch the old interfaces once any version of the DLL is in production. The old client will happily use the old interface, and newer clients can use the new interface.
The new client using an old interface error is trappable by using the iUnknown.QueryInterface method. In VB, you can do this:
If Not TypeOf myObjectReference Is myNewInterface Then
'gracefully handle the error
End If
This will call the QueryInterface method, and will return false if you are referencing an older version of the DLL. You can message the user that he needs to install the newer version of the DLL and quit. You can wrap this functionality into a function and call it when you initialize the object in your new client. If the new interface isn't supported, you have an old version of the DLL; you can message the user to install the newer version and go from there.