f8g

SilverlightでJavaScriptのライブラリを書く

メモ。

クラスにScriptableTypeAttributeを設定する

ScriptableTypeAttribute Class (System.Windows.Browser) | Microsoft Docs

<Browser.ScriptableType()> _
Public Class Library1
    Dim _aaa As Integer = 1

    Public Property aaa() As Integer
        Get
            Return Me._aaa
        End Get
        Set(ByVal value As Integer)
            _aaa = value
        End Set
    End Property

    Public Function bytesFromBase64(ByVal s As String) As Byte()
        Return Convert.FromBase64String(s)
    End Function

    Public Function fromBase64(ByVal s As String) As String
        Dim bytes() As Byte = Me.bytesFromBase64(s)
        Return Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length)
    End Function

    Public Function toBase64(ByVal s As String)
        Return Convert.ToBase64String(Text.Encoding.UTF8.GetBytes(s))
    End Function
End Class
Dim lib1 As New Library1
window.SetProperty("Lib1", lib1)

Firebugからはフィールドが見えない。

ScriptObjectに追加していく

ScriptObjectにメソッドをそのまま追加するのは無理そうだけど、プロパティにラムダ式で書けばできそう。

Public Class Library2
    Public bytesFromBase64 As Func(Of String, Byte()) = Function(s As String) Convert.FromBase64String(s)
    Public toBase64 As Func(Of String, String) = Function(s As String) Convert.ToBase64String(Text.Encoding.UTF8.GetBytes(s))
    Public fromBase64 As Func(Of String, String) = Function(s As String) Me._fromBase64(s)

    Public Function _fromBase64(ByVal s As String) As String
        Dim bytes() As Byte = Me.bytesFromBase64(s)
        Return Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length)
    End Function
End Class
Dim lib2 As New Library2
Dim instance As Browser.ScriptObject = window.CreateInstance("Object")
Dim fields() As Reflection.FieldInfo = lib2.GetType.GetFields

For Each field As Reflection.FieldInfo In fields
    instance.SetProperty(field.Name, field.GetValue(lib2))
Next

window.SetProperty("Lib2", instance)

Firebugからも見える。
http://gyazo.com/5f32c9a920d43f9ceb9281d71bc74268.png