C#找不到指定的文件

时间:2011-01-13 12:32:43

标签: c# .net cmd process.start

您好我正在尝试创建一个使用msg.exe通过网络发送邮件的应用程序。

当我从cmd执行msg时一切正常,但是当我用我无法使用的表单打开cmd时,使用cmd转到system32文件夹并且文件没有显示在那里,但是当我浏览或正常使用cmd时是和evrything工作

在另一台计算机上测试它,应用程序运行良好,在此1上运行win 7 64位。

以下是我用来打开cmd的代码示例:

Process.Start("cmd");

我正在运行作为管理员我已经尝试直接从msg.exe执行它,它似乎是64位工作在所有32位系统上但不在任何64位上的问题

编辑:确定我在运行64位32位应用程序时发现问题无法在系统32文件夹中运行64位应用程序。当试图访问此文件夹时,它会将您重定向到%WinDir%\ SysWOW64,解决方法是使用此路径C:\ Windows \ Sysnative \ file(%windir%\ Sysnative)

6 个答案:

答案 0 :(得分:2)

问题中提到的解决方案对我来说是什么诀窍 - 在这里为后代发布可测试的解决方案:

public class Messenger : IMessenger
{
    private readonly IProcessWrapper _process;

    public Messenger(IProcessWrapper process)
    {
        _process = process;
    }

    public void SendMessage(string message)
    {
        var info = new ProcessStartInfo
            {
                WorkingDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "sysnative"),
                FileName = "msg.exe",
                Arguments = string.Format(@" * ""{0}""", message),
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = true,
                Verb = "runas"
            };
        _process.Start(info);
    }
}


public interface IProcessWrapper : IDisposable
{
    IEnumerable<Process> GetProcesses();
    void Start(ProcessStartInfo info);
    void Kill();

    bool HasExited { get; }
    int ExitCode { get; }
}

答案 1 :(得分:1)

你需要使用cmd吗?为什么不使用Process.Start直接调用msg.exe。如果你知道它在哪里,你应该能够运行它。

答案 2 :(得分:1)

如果您在应用中,最好直接执行“msg”

Process.Start("msg");

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "msg.exe";
startInfo.Arguments = "/SERVER hellowword";
startInfo.WorkingDirectory = @"C:\Temp";
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.ErrorDialog = true;
Process process = Process.Start(startInfo);

答案 3 :(得分:1)

Process p = new Process();
System.Diagnostics.ProcessStartInfo sinfo = new System.Diagnostics.ProcessStartInfo("C:\\Windows\\System32\\msg.exe");
p.StartInfo.Arguments=String.Format("/server:{0} {1} {2}",toServer,string.Compare(toUser.Trim(), "") == 0 ? "*" : toUser,message);
p.StartInfo = sinfo;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = "msg.exe";
p.Start();

您可能需要为进程的StartInfo设置“用户名”和“密码”。(“msg.exe”驻留在系统文件夹中,运行代码的用户没有从中运行的相应权限文件夹)。

答案 4 :(得分:0)

在某些Windows版本(例如Home,而不是Professional / Business等)上,不包含msg.exe。

答案 5 :(得分:0)

也许您应该检查要构建的“目标平台”。 在我的64位win7 pc上,我应该选择“x64”或“Any CPU”让我的代码找到“msg.exe”。