2011-10-20 10 views
5

Env: .NET 3.5 Visual Studio 2008 SP1, trên Win XP SP3, Python 2.7. Hình ảnh công ty, không có quyền quản trị.C# đối số dòng lệnh với dòng mới không thành công trong C# nhưng không phải trong python. Cần làm cho C# work

Trong C# 3.5, tôi muốn chuyển tham số cho chương trình dòng lệnh và tham số này chứa dòng mới. Nó hoạt động trong Python 2.7 nhưng không phải trong C#.

Khi nội dung chứa dòng mới, C# cắt ngắn kết quả, nhưng python chuyển nó chính xác.

mã Python # mã

cmd = self.app_path + ' email -Subject "' + subject + '" -From "' + address_from + '" -To "' + address_to +'" -Body "' + body +'"' 
cmd_result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate() 

C:

string Command = "<path to executable>";     
string arguments = " email -From " + FromAddress + " -To " + ToAddress + " -Subject \"" + SubjectLine + "\" -Body \"" + emailBody + "\" "; 
System.Diagnostics.ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo(Command, arguments); 
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
start.CreateNoWindow = false; 
start.UseShellExecute = true; 
System.Diagnostics.Process process = System.Diagnostics.Process.Start(start); 

Bất kỳ ý tưởng?

Cập nhật: nội dung trong ví dụ trăn và emailBody trong ví dụ C# chứa cùng một chuỗi, vì chuỗi được thể hiện bằng từng ngôn ngữ.

Cập nhật: nhận thấy lệnh không được chấm dứt chính xác trong mã python. Tôi đã thêm + '"' ở cuối dòng 2. Mã này chạy như trước.

Ngoài ra, như bạn có thể nói, các ứng dụng được gọi là gửi cơ thể (emailBody) nội dung thông số như một cơ thể email.

+0

Ed, tôi có nghĩa là con trăn chuyển các ký tự dòng mới theo cách được hiểu chính xác bởi ứng dụng, như trong, chúng là ký tự dòng mới, không chuỗi chấm dứt. –

+0

Do C# và mã python gọi cùng một quá trình với cùng một đối số? – GianT971

+0

@ GianT971, vâng. –

Trả lời

1

xin lỗi nhưng tôi nghĩ rằng nó là quá trình bạn gọi mà không mất các đối số một cách chính xác, nó không phải là C# mà là tham gia, và như là một bằng chứng về điều đó:

  • Tạo một ứng dụng cửa sổ hình thức mới
  • Đảm bảo rằng chữ ký chính trông giống như sau:

    static void Main(string[] args) 
    
  • Hãy chắc chắn rằng tiếng gọi của Form chính của bạn (tên Form1) trông như thế này:

    if (args==null) 
        { 
         Application.Run(new Form1()); 
        } 
        else 
        { 
         Application.Run(new Form1(args)); 
        } 
    
  • Thêm một textbox để hình của bạn, với tài sản multiline thiết lập là true

  • Thêm nút vào biểu mẫu của bạn

  • Chạy ứng dụng một lần

  • Rồi Đặt này trong mã của hàm button1_Click của bạn (thay thế TheNameOfTheCurrentApp):

    string Command = "TheNameOfTheCurrentApp";     
        string arguments = textBox1.Text; 
        System.Diagnostics.ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo(Command, arguments); 
        start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized; 
        start.CreateNoWindow = true; 
        start.UseShellExecute = true; 
        System.Diagnostics.Process process = System.Diagnostics.Process.Start(start);   
    
  • Thêm constructor này để hình của bạn:

    public Form1(string[] args) 
    { 
        InitializeComponent(); 
        textBox1.Text = string.Join(" ", args); 
    } 
    
  • Sau đó chạy ứng dụng của bạn, chèn dòng muliple trong textbox của bạn và nhấp vào nút. Cùng một ứng dụng sẽ xuất hiện với hộp văn bản được điền chính xác với ngắt dòng

+0

Ứng dụng tôi gọi không được phát triển bởi chúng tôi, mà bởi một nhóm khác và chúng tôi không thể sửa đổi nó. –

+0

Và câu hỏi sau đó trở thành, tại sao nó hoạt động khi gọi ứng dụng từ python 2.7? Có lẽ nó có liên quan đến chuỗi byte so với unicode16 không? –

+0

Thành thật mà nói, tôi không thấy bất kỳ nguyên nhân nào khác ngoài mã hóa, nếu nó hoạt động cho python và không phải cho C#. Bạn nên cố gắng tìm cách để mã C# của bạn gửi thông tin theo kiểu mã hóa khác nhau – GianT971

Các vấn đề liên quan