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からも見える。