gpt4 book ai didi

c# - CLI C++ 派生自 C# 一次性类

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:06 25 4
gpt4 key购买 nike

我正在尝试创建一个派生自 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()

最佳答案

如您所述,在 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;
}

输出:

Disposing: ~CppDisposeFinalizing: !CppDispose

So that you can see what's going on behind the scenes, here's the methods that the C++/CLI compiler wrote for us, decompiled to C# syntax. In this case, the parent class has Dispose(void) implemented, so it's not reimplemented here.

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

关于c# - CLI C++ 派生自 C# 一次性类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14370015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com