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