Tôi đang bắt đầu một ứng dụng bảng điều khiển nhỏ từ bên trong ứng dụng web IIS của tôi. Mã này được bắt đầu từ bên trong bể bơi ứng dụng sử dụng mã như thế này,Sự khác biệt nào có UseShellExecute có?
Process process = new Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.CreateNoWindow = true;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// ..
process.Start();
tôi sử dụng để liên tục gặp phải lỗi,
Win32Exception exception has occured Message: No such interface supported
ErrorCode: 80004005 NativeErrorCode: 80004002
tôi đã chứng minh rằng khi điều này xảy ra các ứng dụng giao diện điều khiển sẽ không bắt đầu từ tất cả các.
tôi đã thêm vào mã ở trên này,
processStartInfo.UseShellExecute = false;
Và vấn đề đã ra đi (cho đến nay, những ngón tay vượt qua). Tôi hiểu rằng bằng cách thực hiện thay đổi này, nó không yêu cầu ngữ cảnh máy tính để bàn hợp lệ để chạy, nhưng điều đó có nghĩa là gì. Nếu điều đó có nghĩa là chúng tôi không thể chạy mã trên nếu không có máy tính để bàn (áp dụng cho một nhóm ứng dụng IIS đang chạy với người dùng hệ thống), thì tại sao nó lại chạy trong quá khứ thay vì thất bại mỗi lần?
Có ai có bất kỳ ý tưởng nào tại sao điều này sẽ tạo sự khác biệt không? Không hỗ trợ giao diện nào trong ngữ cảnh này?
CẬP NHẬT:
Tôi đã thực hiện mọi thứ mọi người đã nói và tự nghiên cứu thêm. Vì vậy, để tóm tắt nếu bạn có UseShellExecute = true (đó là mặc định) thì nó sẽ gọi ShellExecuteEX trong shell32.dll để thực thi quá trình. Nó sẽ làm được điều này thực sự (sao chép từ System.dll sử dụng ILSpy),
public bool ShellExecuteOnSTAThread()
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
ThreadStart start = new ThreadStart(this.ShellExecuteFunction);
Thread thread = new Thread(start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
else
{
this.ShellExecuteFunction();
}
return this._succeeded;
}
Nếu bạn có UseShellExecute = false thì nó sẽ gọi CreateProcess trong kernel32.dll để bắt đầu quá trình.
Tôi đã tự hỏi liệu có sự cố với mã ShellExecuteOnSTAThread ở trên đang tạo chuỗi mới không? Có thể các hồ bơi ứng dụng đạt được một số giới hạn về luồng mà gián tiếp có thể gây ra một Win32Exception?
Tôi đã thấy chế độ lỗi cụ thể này được đề cập nhiều lần trong vài tháng qua. Không có gì gần với một lời giải thích, nhưng bằng cách sử dụng UseShellExecute = false sẽ nhất định sửa chữa nó. –
Cảm ơn. Bạn đã thấy nó ở đâu khác? Tôi thực sự không thể tìm thấy nó ở đâu? Xin lỗi nếu tôi hỏi một câu hỏi bạn không thể trả lời, nhưng tôi sẽ tò mò nếu bạn có thể tìm thấy chúng. – peter
Điều này không trả lời những gì Hans đang nhận được nhưng câu hỏi SO này có một số chi tiết thú vị: http://stackoverflow.com/questions/5255086/when-do-we-need-to-set-useshellexecute-to-true –