我想TensorFloat
在我的 C# .NET Core 5.0 应用程序中获得指向 a 背后数据的指针。我首先声明IMemoryBufferByteAccess
:
[ComImport]
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}
然后,在推理之后,我尝试如下使用它:
var outputTensor = (TensorFloat)session.Evaluate(binding, "0").Outputs["myAwesomeOutput:0"];
using var outputReference = outputTensor.CreateReference();
((IMemoryBufferByteAccess)outputReference).GetBuffer(out var onnxOutput, out var onnxCapacity);
这导致了一个System.InvalidCastException: 'Invalid cast from 'WinRT.IInspectable' to 'IMemoryBufferByteAccess'.'
令人惊讶的结果,因为Windows.Media和Windows.Graphics的方法完全相同。Windows.Foundation.IMemoryBufferReference的文档甚至指出:
相同的对象标识还必须实现 COM 接口 IMemoryBufferByteAccess。客户端通过 QueryInterface 从 IMemoryBufferReference 对象中检索 IMemoryBufferByteAccess 接口指针。
我错过了什么?