I'm in the middle of refactoring some ugly code that synchronizes a couple of our systems. One of our systems forces us to use an API; we're not allowed to modify the database directly or we void our service contract. You'd hope, then, that they provide a decent API for interacting with the system.
Well, first things first, the "API" is really just a bunch of horrible .Net wrappers around COM components.
Next, we come to the fact that they have their own "IDisposable" interface, called "IBBDisposable". It doesn't have a "Dispose" method, instead it has a "CloseDown" method. So basically, if you want to use it inside of a using block, you have to make your own wrapper for it. To make matters worse, the semantics of CloseDown aren't well defined like they are with IDisposable.Dispose.
As if that's all not bad enough, the classes that implement IBBDisposable also implement their own interface (ala DoSomethingClass : IDoSomethingClass), and these base interfaces don't implement IBBDisposable. This means that you have to do some casting to get to the CloseDown method, and that if you're using the interfaces it's not obvious that CloseDown even needs to be called.
Please, if you're designing an API, don't do this to the consumers.