Interaction.Command メソッドの仕様について

MIZUSHIMA KEIICHI(水島 圭一) 10 評価のポイント
2024-12-12T01:57:19.29+00:00

Interaction.Command メソッドの仕様について、ご教示ください。

https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.interaction.command?view=net-9.0&viewFallbackFrom=net-8

こちらのメソッドですが、以前(2018年頃(.NetFramework4.7.2))に作成したプログラムでは、全角空白で分割されないのですが、2024年に移行(.Net6)した時は全角空白でも分割されました。ここは、以前と比較して動きが変わっているのでしょうか?

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
76 件の質問
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. gekka 10,821 評価のポイント MVP
    2024-12-12T04:49:19.3633333+00:00

    引数の b と cの間に全角スペースがあるコマンドラインで試すと、System.Environment.CommandLineの結果は、

    Framework
    4.7.2 "\Debug\net472\VBConsoleCore.exe"  a b c
    
    Core
    3.0   "\Debug\net3.0\VBConsoleCore.exe"  a b c
    5.0   \Debug\net5.0\VBConsoleCore.dll a "b c"
    6.0   \Debug\net6.0\VBConsoleCore.dll a "b c"
    8.0   \Debug\net8.0\VBConsoleCore.dll a "b c"
    

    のようになりました。

    どうもSystem.Environment.CommandLineで得られる文字列が.NET Core 5 で変化したっぽい。
    .NET 5 での破壊的変更には明確な記述は見つかりませんが、関係あるとしたら文字の判定処理がICUライブラリに変更されたからかもしれない。

    Microsoft.VisualBasic.Interaction.Commandはこの文字列に対して処理しているようなので、異なる結果になっているのかも。

    提示されたコードから推測すると未加工のコマンドライン引数を取りたいようなので、WindowsAPIのGetCommandLineWを使ってみては?

    Module Program
    
        <System.Runtime.InteropServices.DllImport("kernel32.dll", EntryPoint:="GetCommandLineW", CharSet:=Runtime.InteropServices.CharSet.Unicode)>
        Private Function GetCommandLine() As IntPtr
        End Function
    
        Sub Main(args As String())
    
            Dim commandLine = System.Runtime.InteropServices.Marshal.PtrToStringUni(GetCommandLine())
    
            Dim a = Microsoft.VisualBasic.Interaction.Command
            Dim b = System.Environment.CommandLine
            Dim c = System.Environment.GetCommandLineArgs()
    
    
        End Sub
    End Module
    

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。