es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar Windows.Storage.Streams.DataWriter con PowerShell

Estoy tratando de usar el método DetachBuffer() de Windows.Storage.Streams.DataWriter, pero PowerShell solo reconoce el objeto IBuffer que se supone que debe devolver como __ComObject. He utilizado otros objetos WinRT exitosamente, pero este me está dando problemas.

[void][Windows.Storage.Streams.DataWriter, Windows.Storage.Streams, ContentType = WindowsRuntime]
$dataWriter = [Windows.Storage.Streams.DataWriter]::new()
$dataWriter.WriteByte(0x01)
$buffer = $dataWriter.DetachBuffer()
$buffer

System.__ComObject

$buffer | Get-Member


   TypeName: System.__ComObject

Name                      MemberType Definition
----                      ---------- ----------
CreateObjRef              Method     System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Equals                    Method     bool Equals(System.Object obj)
GetHashCode               Method     int GetHashCode()
GetLifetimeService        Method     System.Object GetLifetimeService()
GetType                   Method     type GetType()
InitializeLifetimeService Method     System.Object InitializeLifetimeService()
ToString                  Method     string ToString() 

Supongo que necesito “importar” alguna clase de WinRT que DetachBuffer() realmente está devolviendo, pero no tengo ni idea de cuál es, aparte de que implementa la interfaz IBuffer.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el método DetachBuffer() está devolviendo un objeto WinRT que PowerShell no reconoce. Para resolver esto, puedes intentar importar el espacio de nombres Windows.Storage.Streams con el ContentType configurado como WindowsRuntime, al igual que ya lo has hecho con Windows.Storage.Streams.DataWriter. Puedes importar el espacio de nombres utilizando el siguiente código:

    [Windows.Storage.Streams.BytesIOExtensions,Windows.Storage.Streams,ContentType=WindowsRuntime] | Out-Null
    

    Después de importar el espacio de nombres, intenta llamar nuevamente a DetachBuffer() y verifica la salida. Ahora debería reconocerse como un objeto IBuffer.

    [Windows.Storage.Streams.BytesIOExtensions,Windows.Storage.Streams,ContentType=WindowsRuntime] | Out-Null
    
    [void][Windows.Storage.Streams.DataWriter, Windows.Storage.Streams, ContentType = WindowsRuntime]
    $dataWriter = [Windows.Storage.Streams.DataWriter]::new()
    $dataWriter.WriteByte(0x01)
    $buffer = $dataWriter.DetachBuffer()
    $buffer
    $buffer | Get-Member
    

    Esto debería producir la siguiente salida:

    Length        : 1
    Capacity      : 1
    DataReader    : System.Runtime.InteropServices.WindowsRuntime.RuntimeClass
    IBufferNative : System.Runtime.InteropServices.WindowsRuntime.RuntimeClass
    InputStream   : System.Runtime.InteropServices.WindowsRuntime.RuntimeClass
    OutputStream  : System.Runtime.InteropServices.WindowsRuntime.RuntimeClass
    

    Ahora puedes utilizar el objeto IBuffer devuelto por DetachBuffer() según sea necesario.

Comments are closed.