Are C# destructors the same as C++ destructors?

No they are not the same. They look the same but they're very different.
First of all, a C# destructor isn't guaranteed to be called at any particular time. In fact it's not guaranteed to be called at all. Truth be told, a C# destructor is really just a Finalize method in disguise. In particular, it is a Finalize method with a call to the base class Finalize method inserted.
For example: class CTest
{
~CTest()
{
    System.Console.WriteLine( "Bye bye" );
}
}
C# Example:
class CTest
{
    protected override void Finalize()
    {
        System.Console.WriteLine( "Bye bye" );
        base.Finalize();
    }
}
With the arrival of Beta 2, explicitly overriding Finalize() like this is not allowed - the destructor syntax must be used.