Tôi đang cố gắng sử dụng đối tượng COM ImageMagick (ImageMagickObject) trong một thư viện .NET. Thư viện này có ý định được gọi từ IronRuby, nhưng đó không phải là tất cả những điều quan trọng. Tôi muốn thực hiện phương pháp này vì nó sẽ phù hợp với các cuộc gọi hiện tại của tôi, hiện đang gọi các tệp nhị phân ImageMagick dưới dạng các quy trình bên ngoài. Đối tượng COM sẽ lấy các đối số giống như các tệp nhị phân, nhưng sẽ lưu quá trình tạo và nhanh hơn khoảng 5 lần tổng thể.Chuyển hướng đầu ra STDERR từ trình bao bọc đối tượng COM trong .NET
Trở ngại duy nhất của tôi là phương pháp "So sánh" đối tượng COM trả về kết quả của nó cho STDERR. Đây cũng là một vấn đề với nhị phân, nhưng thật dễ dàng để quay trở lại STDOUT, nơi tôi đang mong đợi nó. Với đối tượng COM, tôi nhận được kết quả từ các giá trị trả về hàm.
Làm cách nào để chuyển hướng kết quả từ "So sánh" sang bộ đệm chuỗi hoặc thậm chí một tệp thay vì STDERR?
Tôi đã thử những điều sau đây, mà không ngăn chặn đầu ra từ đạt stderr, nhưng nó không ghi được vào file như mong đợi:
using ImageMagickObject;
...
public class ImageMagickCOM
{
[DllImport("Kernel32.dll", SetLastError = true)]
public static extern int SetStdHandle(int device, IntPtr handle);
private const int STDOUT_HANDLE = -11;
private const int STDERR_HANDLE = -12;
private ImageMagickObject.MagickImage magickImage = null;
private FileStream filestream = null;
private StreamWriter streamwriter = null;
public ImageMagickCOM()
{
IntPtr handle;
int status;
filestream = new FileStream("output.txt", FileMode.Create);
streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
//handle = filestream.Handle; // deprecated
handle = filestream.SafeFileHandle.DangerousGetHandle(); // replaces filestream.handle
status = SetStdHandle(STDOUT_HANDLE, handle);
status = SetStdHandle(STDERR_HANDLE, handle);
Console.SetOut(streamwriter);
Console.SetError(streamwriter);
magickImage = new ImageMagickObject.MagickImage();
}
public string Compare()
{
object[] args = new object[] { "-metric", "AE", "-fuzz", "10%", "imageA.jpg", "imageB.jpg", "diff.png" };
return (string)this.magickImage.Compare(ref args);
}
public void Close()
{
if (this.magickImage != null)
{
Marshal.ReleaseComObject(magickImage);
this.magickImage = null;
}
if (this.streamwriter != null)
{
this.streamwriter.Flush();
this.streamwriter.Close();
this.streamwriter = null;
this.filestream = null;
}
}
}
Chỉ "So sánh" hành động dường như sử dụng thiết bị lỗi chuẩn để gửi một kết quả (nó sử dụng giá trị trả về như một chỉ báo thành công). Tất cả các phương pháp khác (Xác định, Chuyển đổi, Mogrify, vv) hoạt động như bạn mong đợi.
Để tham khảo, nó được gọi là một cái gì đó như thế này (từ IronRuby):
require 'ImagingLib.dll'
im = ImagingLib::ImageMagickCOM.new
im.compare # returns nil
im.close
Và output.txt được tạo ra, nhưng trống rỗng. Không có gì được in tới STDOUT hoặc STDERR.
CHỈNH SỬA: Để rõ ràng về tuôn ra luồng/đóng luồng và cách mẫu được sử dụng từ IronRuby.
Tôi đã cố gắng xóa bộ đệm trước và sau khi gọi xong để không có may mắn. – cgyDeveloper