public virtual void Open(string deviceId) { if (device != null) { return; } // 排他制御用のセマフォを生成する var semName = Regex.Replace("WpdMtpSem" + deviceId, "[^0-9a-zA-Z]", "", RegexOptions.Singleline); if (sem == null) { sem = new Semaphore(1, 1, semName); } else if (!existSemaphoreName.Equals(semName)) { var tempsem = sem; sem = new Semaphore(1, 1, semName); tempsem.Close(); } device = new PortableDevice(); IPortableDeviceValues clientInfo = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValues(); device.Open(deviceId, clientInfo); Marshal.ReleaseComObject(clientInfo); // eventを受信できるようにする WpdEvent wpdEvent = new WpdEvent(this); IPortableDeviceValues eventParameter = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValues(); device.Advise(0, wpdEvent, eventParameter, out eventCookie); }