2

我正在尝试创建一个派生自HashAlgorithm. HashAlgorithm有一个virtual Dispose(bool)方法。我无法覆盖该Dispose方法,因为我收到一个编译错误,说明dispose是保留关键字。根据我在网上阅读的内容,只需添加一个终结器和 dtor,编译器就会处理其他所有事情。我这样做了,代码编译了。当我尝试使用时,出现以下错误:

System.TypeLoadException: Declaration referenced in a method implementation cannot be a final method

当我查看编译器生成的代码时,我看到它把这个密封的关键字放在似乎是问题根源的方法上。该Dispose方法根本不需要,因为它已经存在于基类中。关于如何解决这个问题的任何想法。

public sealed override void Dispose()
4

1 回答 1

2

正如您所指出的,在 C++/CLI 中,我们实现了 ~ClassName 和 !ClassName,C++/CLI 编译器为我们编写了 Dispose(void) 和 Dispose(bool)。

我尝试从 HashAlgorithm 派生,并且能够使 dispose 和 finalize 都能正常工作。声明某些方法的方式可能存在细微差别。

这是我的测试代码:

public ref class CppDispose : HashAlgorithm
{
private:
    ~CppDispose() { Debug::WriteLine("~CppDispose"); }
    !CppDispose() { Debug::WriteLine("!CppDispose"); }

protected:
    virtual void HashCore(array<Byte>^ aray, int ibStart, int cbSize) override { }
    virtual array<Byte>^ HashFinal() override { return nullptr; }

public:
    virtual void Initialize() override { }
};

int main(array<System::String ^> ^args)
{
    {
        CppDispose foo;

        Debug::WriteLine("Disposing: ");
    }

    {
        CppDispose^ foo = gcnew CppDispose();

        Debug::WriteLine("Finalizing: ");
        foo = nullptr;
        GC::Collect();
    }

    return 0;
}

输出:

处置:
~CppDispose
最终确定:
!CppDispose

为了让您可以看到幕后发生的事情,这里是 C++/CLI 编译器为我们编写的方法,反编译为 C# 语法。在这种情况下,父类已经实现了 Dispose(void),所以这里不再重新实现。

[HandleProcessCorruptedStateExceptions]
protected override void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1)
{
    if (flag1)
    {
        try
        {
            this.~CppDispose();
        }
        finally
        {
            base.Dispose(true);
        }
    }
    else
    {
        try
        {
            this.!CppDispose();
        }
        finally
        {
            base.Dispose(false);
        }
    }
}

protected override void Finalize()
{
    this.Dispose(false);
}
于 2013-01-17T00:26:51.437 回答