CLI c++派生自c#的一次性类

本文关键字:一次性 c++ 派生 CLI | 更新日期: 2023-09-27 17:53:41

我试图创建一个从HashAlgorithm派生的CLI c++类。HashAlgorithm有一个virtual Dispose(bool)方法。我无法覆盖Dispose方法,因为我得到一个编译错误,说明dispose是保留关键字。从我在网上看到的只是添加一个终结器和医生和编译器将照顾其他一切。我这样做了,代码就编译好了。当我尝试使用时,我得到下面的错误:

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

当我查看编译器生成的代码时,我看到它将这个密封关键字放在似乎是问题根源的方法上。实际上根本不需要Dispose方法,因为它已经存在于基类中。有什么好主意吗?

public sealed override void Dispose()

CLI c++派生自c#的一次性类

正如你所注意到的,在c++/CLI中我们实现了~ClassName和!ClassName,并且c++/CLI编译器为我们写了Dispose(void)和Dispose(bool)。

我尝试从hashalgalgorithm派生,并且我能够获得dispose &完成工作。也许在一些方法的声明方式上有细微的差别。

下面是我的测试代码:
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);
}