c# - 不使用 SetOut 控制台输出到文件

标签 c# dll console

我正在从 C# 调用 Gurobi(多次)。因此,控制台输出是我的和 Gurobi 日志记录的混合。如果我覆盖 Console.Out,则只有我的输出被重定向,但 Gurobi(显然包装了非托管 dll)仍然写入屏幕。

有什么方法可以从控制台获取每一行(作为字符串或文件)?

最佳答案

您可以使用回调对象捕获 Gurobi 的控制台输出。回调对象有一个 Callback() 方法,调用该方法的原因有很多,其中之一是告诉您它将要写入控制台的文本。您可以对这段文字做任何您想做的事情。在下面的示例中,我将文本编写为调试输出:

class MyGRBCallback : GRBCallback
{
    protected override void Callback()
    {
        if (this.where == GRB.Callback.MESSAGE)
        {
            String text = this.GetStringInfo(GRB.Callback.MSG_STRING);
            Debug.WriteLine(text);
        }
    }
}

您可以使用 GRBModel 的 SetCallback 方法告诉 Gurobi 您的回调对象。

var env = new GRBEnv();
var m = new GRBModel(env);
var callback = new MyGRBCallback();
m.SetCallback(callback);

Gurobi 此时将调用您的回调并写入控制台。您可以告诉 Gurobi 不要写入控制台:

env.Set(GRB.IntParam.LogToConsole, 0);

关于c# - 不使用 SetOut 控制台输出到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28982082/

相关文章:

delphi - 如何在Delphi XE2上调试2个dll?

Javascript 函数序列示例

c# - 是否有 C# API 或 Web 服务来获取 NSE 或 BSE 的报价?

c# - 上传到托管服务器后 Entity Framework 连接错误

c++ - 如何在 dll 中创建一个 shared_ptr 并通过工厂函数导出它?

c# - 如何从 C++ 代码使用在 C# DLL 中定义的类

linux - 如何找到当前的虚拟终端

c# - 控制台窗口按参数显示

c# - 无法识别的转义序列\_。 C# 正则表达式

c# - 实例与方法作为参数——理解生命周期和垃圾收集