酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

VB.NETを使ってオブジェクトをコマンドライン引数として渡す

アプリケーション間でコマンドライン引数でしか情報の引渡しが出来ないので、オブジェクトを文字列として渡してみるなどしてみました。

例えば、入力を行うSendと受け取るReceiveがあるとします。Sendは入力データが格納されているオブジェクトを文字列化し、Receiveはコマンドライン引数で入力値を受け取ります。

受け渡しするするオブジェクト

Imports System.Runtime.Serialization  
Imports System.Runtime.Serialization.Formatters.Binary  
Imports System.IO  
  
<Serializable()> _  
Public Class SerializableArgument  
    Implements ISerializable  
  
  
    Public MessageText As String  
    Public Check As Boolean  
  
  
    Public Sub New()  
    End Sub  
  
    Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)  
        MessageText = info.GetString("Text")  
        Check = info.GetBoolean("Check")  
    End Sub  
  
    Protected Sub GetObjectData(ByVal info As SerializationInfo, _  
                                ByVal context As StreamingContext) _  
                                Implements ISerializable.GetObjectData  
  
        info.AddValue("Text", MessageText)  
        info.AddValue("Check", Check)  
  
    End Sub  
  
    Public Function ToDataString() As String  
  
        Dim formatter As New BinaryFormatter  
        Dim stream As New MemoryStream  
  
        formatter.Serialize(stream, Me)  
        Dim data As String = Convert.ToBase64String(stream.ToArray())  
  
        Return data  
    End Function  
  
    Public Shared Function FromDataString(ByVal data As String) As SerializableArgument  
  
        Dim bytes() As Byte = Convert.FromBase64String(data)  
        Dim formatter As New BinaryFormatter  
        Dim serializeObject As SerializableArgument = _  
            CType(formatter.Deserialize(New MemoryStream(bytes)), SerializableArgument)  
  
        Return serializeObject  
    End Function  
End Class  

渡す側のアプリ

Public Class SendForm  
    Inherits System.Windows.Forms.Form  
  
    Private Sub Button1_Click(ByVal sender As System.Object, _  
         ByVal e As System.EventArgs) Handles Button1.Click  
  
        ' シリアライズ可能なオブジェクトの生成  
        Dim serializeObject As New SerializableArgument  
  
        ' 渡したい情報  
        serializeObject.MessageText = TextBox1.Text  
        serializeObject.Check = CheckBox1.Checked  
  
        ' シリアライズする  
        Dim data As String = serializeObject.ToDataString()  
  
        Dim proc As New Process  
        proc.StartInfo.FileName = "ReceiveApplication.exe"  
        proc.StartInfo.Arguments = data  
        proc.Start()  
  
    End Sub  
End Class  

受け側のアプリ

Public Class ReceiveForm  
    Inherits System.Windows.Forms.Form  
  
    Private Sub Form1_Load(ByVal sender As Object, _  
         ByVal e As System.EventArgs) Handles MyBase.Load  
  
        Dim arg() As String = System.Environment.GetCommandLineArgs  
  
        ' デシリアライズする  
        Dim serializeObject As SerializableArgument = SerializableArgument.FromDataString(arg(1))  
  
        TextBox1.Text = arg(1)  
        TextBox2.Text = serializeObject.MessageText  
        CheckBox1.Checked = serializeObject.Check  
  
    End Sub  
End Class  

これで、送り側のアプリは、ReceiveApplication.exe "AAEAAAD/////AQAAAAAAAAAM(中略)"として受け側のアプリを起動します。

受け側のアプリで AAEAAAD/////AQAAAAAAAAAM(中略) の文字列をデシリアライズして入力値を使用する事が出来ます。

コマンドライン引数の最大長を気にしたら負けです。むぅ……