We have a .NET dll that we've called PBUtils that does many things for us such as emailing, working with MS Office, and lots of other things .NET can do. We used Bruce's example of creating a COM Wrappable DLL, and every time there a new version we just ask all the developers to re-register it with a batch file. For the final release however we use a manifest file to make it availble to the PowerBuilder application with it being registered, I couldn't get this to work when running from the PB IDE.
It seems to work very well for us, I've even split it up into multiple namespaces so I can call ConnectToNewObject just for the bit I need, for example Common, or Excel. We've also decided to create new versions in the one DLL when an interface changes, e.g. a new argument is added to an existing function call. That way the calling program can specify in ConnectToNewObject that it wants to connect to <company>.PBUtils.Excel_1_20, i.e. a specific version.
Let me know if you need any help if you want to do something similar.
The other thing you can do is create web services in .NET which can be called from PB Classic. I've been looking at this recently and it works pretty well once you work out that you need to use the lowest common denominator of WCF, SOAP 1.1. You can get your datawindows to retrieve and update using web services, and you can call web service methods independently of the datawindow, all in PB Classic.