Bakulog

獏の夢日記的な何か。

C#でシリアル接続デバイス名の一括取得

既存の記事があったんですがコードを縮めたくなったので。

本記事は、WindowsのPCに繋がっているシリアル接続可能なデバイス一覧をC#でとる、という処理の紹介を目的に書きました。

とはいっても、この目的に即した記事はすでにC#でCOMポート番号とシリアル接続機器名を同時に取得する方法というのがあり、私もひとまずコレを読んで真似した、という次第です。

ただ「コード長くね?」と思ったのでちょっと縮めた版を載せておきたいなあ、という事で以下のようにしました。コードの実行にあたり、参照アセンブリSystem.Management.dllの追加が必要な点に注意してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text.RegularExpressions;

namespace GetSerialDeviceNames
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (string deviceName in GetSerialDeviceNames())
            {
                Console.WriteLine(deviceName);
            }
        }

        static IEnumerable<string> GetSerialDeviceNames()
        {
            var pnpEntity = new ManagementClass("Win32_PnPEntity");
            var comRegex = new Regex(@"\(COM[1-9][0-9]?[0-9]?\)"); // デバイス名に"(COM3)"などが入ってるものを探したい
 
            return pnpEntity
                .GetInstances() // 一覧を取得
                .Cast<ManagementObject>()
                .Select(managementObj => managementObj.GetPropertyValue("Name")) // 名前拾ってくる
                .Where(nameObj => nameObj != null) // プロパティ値が拾えないものはnullになっているので弾く
                .Select(nameObj => nameObj.ToString()) // 文字列に直し、
                .Where(name => comRegex.IsMatch(name)); // 正規表現で最後のフィルタリング

        }
    }
}

 

蛇足ですが、私がこの話を調べたのは先日届いたuArm Swift Proの.NETラッパーを作るためです。そっちはライブラリ公開のためにビミョーなつっかかりどころが残っており、公開までもう二日くらいかかりそうな感じです。まあ、頑張っていきましょう。