Я хочу получить указатель на данные, стоящие за TensorFloat в моем приложении C # .NET Core 5.0. Я начал с объявления 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. Клиент получает указатель интерфейса IMemoryBufferByteAccess через QueryInterface из объекта IMemoryBufferReference.

Что мне не хватает?

0
Simon 11 Фев 2021 в 04:15

1 ответ

Лучший ответ

Мне удалось заставить его работать. Сначала мне пришлось импортировать метод расширения:

using WinRT;

Затем используйте метод расширения As(...) для преобразования в IMemoryBufferByteAccess, чтобы получить указатель:

outputReference.As<IMemoryBufferByteAccess>().GetBuffer(out var onnxOutput, out var onnxCapacity);
0
Simon 11 Фев 2021 в 01:50