CLI C ++派生自C#易失性类

时间:2013-01-16 23:52:40

标签: c# .net c++-cli dispose

我正在尝试创建一个派生自HashAlgorithm的CLI C ++类。 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()

1 个答案:

答案 0 :(得分:2)

如前所述,在C ++ / CLI中我们实现了~ClassName和!ClassName,而C ++ / CLI编译器为我们写了Dispose(void)和Dispose(bool)。

我尝试从HashAlgorithm派生,我能够得到处理和放置。最终确定工作。也许你对如何申报一些方法有一个微妙的区别。

这是我的测试代码:

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;
}

输出:

Disposing: 
~CppDispose
Finalizing: 
!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);
}