c#小程序换机子不能直接运行.EXE。需重新编译,求解答?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Management;

namespace getid
{
public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }
    private void getid()
    {
        udisk upan = new udisk();
        string[] aa;
        upan.matchDriveLetterWithSerial();
        aa = upan._serialNumber.ToArray();
        try
        {
            textBox1.Text = aa[0];
        }
        catch (Exception e)
        {
            textBox1.Text = "";
            MessageBox.Show("请在电脑U盘识别后启动程序!");
        }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        getid();
    }

}

public class udisk     
{
    public List<string> _serialNumber = new List<string>();

    #region 获取优盘的序列号
    /// <summary>
    /// 调用这个函数将本机所有U盘序列号存储到_serialNumber中
    /// </summary>
    public void matchDriveLetterWithSerial()
    {
        string[] diskArray;
        string driveNumber;
        var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
        foreach (ManagementObject dm in searcher.Get())
        {
            getValueInQuotes(dm["Dependent"].ToString());
            diskArray = getValueInQuotes(dm["Antecedent"].ToString()).Split(',');
            driveNumber = diskArray[0].Remove(0, 6).Trim();
            var disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
            foreach (ManagementObject disk in disks.Get())
            {
                if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) & disk["InterfaceType"].ToString() == "USB")
                {
                    _serialNumber.Add(parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()));
                }
            }
        }
    }

    private static string parseSerialFromDeviceID(string deviceId)
    {
        var splitDeviceId = deviceId.Split('\\');
        var arrayLen = splitDeviceId.Length - 1;
        var serialArray = splitDeviceId[arrayLen].Split('&');
        var serial = serialArray[0];
        return serial;
    }

    private static string getValueInQuotes(string inValue)
    {
        var posFoundStart = inValue.IndexOf("\"");
        var posFoundEnd = inValue.IndexOf("\"", posFoundStart + 1);
        var parsedValue = inValue.Substring(posFoundStart + 1, (posFoundEnd - posFoundStart) - 1);
        return parsedValue;
    }
    #endregion   
}

}
图片说明

用的是vs2010,当然也用过vs2013。都能在我的win7 64位上运行起来,但是在很多测试机子的一台上运行不起来,该机子是win7 64位的,用的是vs2013版本。
在那台运行不起来的机子上,使用vs2013进行编译,能运行的起来,将debug下的程序放在我的机子上,能运行起来。
提问:这样是什么问题导致的在我的机子上编译放在那台机子上运行不起来?
情况:那台机子只有装vs2013,在程序与功能中没有看到.net的组件,但是却能写c#的程序,建工程的时候却能建.net2.0到.net4.5的所有工程。求大神解答,一个礼拜多了,还是没搞懂。
重申问题:是什么问题导致的在我的机子上编译放在那台机子上运行不起来?

按理说不会,那台机器装.net 4.5了么?有2013应该有4.5。
怎么运行不起来。什么错误?在程序的program.cs中的main第一行加上messagebox.show(),看看有没有显示。是不是程序运行了,又因为什么错误退出了。

只要有net framework对应版本。
换机器是不是导致你的程序依赖有问题了。

图片说明
使用我编译的.exe,在那台机子运行时,点击获得id按钮的异常现象(上图)。
在那台机子用源代码重新编译后,程序运行正常。我使用vs2010,那台机子使用vs2013。

换了环境可以运行,但是出错应该还是你的代码没有处理好,有一些你环境的依赖代码。而不是独立的

那和编译没有关系,应该是权限的问题。wmi中有些需要提升权限才能得到。

另外一些山寨盗版的系统会进行所谓的“优化”而关掉wmi服务,导致程序出错。
http://blog.csdn.net/kpp2008/article/details/6582534

难道你打算用U盘当USB狗?这实在是一个很愚蠢的办法。硬件狗也不贵,而用WMI去取U盘序列号并不可靠。