any best practices?
The best practice is to avoid unsafe code. So don't use pointers in C#.
In addition to the other answer that already points out that pointers and unsafe code should be avoided if possible.
You want to avoid having unsafe
code spread out all over your code base so I'd suggest writing a .Net wrapper on top of all your unsafe calls and that way you only need to worry about it in one place. Possibly even create a class library for it, but that depends on what exactly you're doing.
It will obviously be very important that whoever uses the wrapper remembers to call the wrapper's Dispose
methods and similar to make sure that any pointers or other unmanaged resources are disposed of properly, but that's not different from the rest of your code.
In addition to the answer about implementing dispose for types that own pointers, implement the full Dispose\Destructor pattern as users of your API may not always call dispose:
http://www.bluebytesoftware.com/blog/CategoryView,category,DesignGuideline.aspx