From the MSDN article for implementing Finalize;
You should override Finalize for a class that uses unmanaged resources such as file handles or database connections that must be released when the managed object that uses them is discarded during garbage collection.
From the MSDN article for implementing IDisposible.Dispose;
Use this method to close or release unmanaged resources such as files, streams, and handles held by an instance of the class that implements this interface. By convention, this method is used for all tasks associated with freeing resources held by an object, or preparing an object for reuse.
Which, even in the context of each (thorough) article, seems to be a pretty ambiguous definition.
Where I really lose the purpose of Finalize though, is here;
Because garbage collection is non-deterministic, you do not know precisely when the garbage collector performs finalization. To release resources immediately, you can also choose to implement the dispose pattern and the IDisposable interface. The IDisposable.Dispose implementation can be called by consumers of your class to free unmanaged resources, and you can use the Finalize method to free unmanaged resources in the event that the Dispose method is not called.
Am I supposed to implement both, and force a finalize myself in the event that the consuming application forgets to dispose my object?
Dealing so closely with the GC is new to me...and I want to make sure I drop my resources properly. However, I don't fully understand why both of these exist, or when to use each one.