小编gwi*_*rrr的帖子

从WPF Windows应用程序到实际控制台输出Console.WriteLine

背景:我正在努力为现有的WPF Windows应用程序添加命令行和批处理功能.当我在启动时检测到一些选项时,我禁止窗口出现,进行一些处理并立即退出.现在,因为没有UI,我想将一些消息输出到stdout/stderr.考虑以下代码:

namespace WpfConsoleTest
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            Console.WriteLine("Start");
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("Stop");
            Shutdown(0);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行时,我希望以下输出:

Start
Stop
Run Code Online (Sandbox Code Playgroud)

但反而:

C:\test>WpfConsoleTest.exe

C:\test>
Run Code Online (Sandbox Code Playgroud)

但是,您可以重定向输出:

C:\test>WpfConsoleTest.exe > out.txt

C:\test>type out.txt
Start
Stop
Run Code Online (Sandbox Code Playgroud)

不幸的是,重定向到CON不起作用:

C:\test>WpfConsoleTest.exe > CON

C:\test>
Run Code Online (Sandbox Code Playgroud)

另一个问题是WpfConsoleTest.exe在启动后立即退出.所以:

C:\test>WpfConsoleTest.exe > out.txt & type out.txt

C:\test>
Run Code Online (Sandbox Code Playgroud)

但:

C:\test>WpfConsoleTest.exe > out.txt & ping localhost > nul & type out.txt
Start
Stop
Run Code Online (Sandbox Code Playgroud)

到目前为止,我能够提供的最佳解决方案是使用start /B /wait:

C:\test>start /B /wait WpfConsoleTest.exe …
Run Code Online (Sandbox Code Playgroud)

c# wpf cmd batch-file

27
推荐指数
3
解决办法
2万
查看次数

基于参数的C预处理器宏专业化

是否有可能为一个特定的参数值以不同的方式扩展一个宏,对所有其他参数的扩展方式不同?

假设我定义了一个当前用户:

#define CURRENT_USER john_smith
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是拥有一个宏,如果用户通过匹配,将以不同方式展开CURRENT_USER.请注意,我不知道所有可能的用户先验.最基本的案例:

#define IS_CURRENT_USER(user)                   \
    /* this is not valid preprocessor macro */  \
    #if user == CURRENT_USER                    \
        1                                       \
    #else                                       \
        0                                       \
    #endif                                      
Run Code Online (Sandbox Code Playgroud)

像宏一样,依赖于用户名的每个其他宏都可以按照以下方式完成:

#define SOME_USER_SPECIFIC_MACRO(user) SOME_USER_SPECIFIC_MACRO_SWITCH_1(IS_CURRENT_USER(user))

#define SOME_USER_SPECIFIC_MACRO_SWITCH_1(switch)   SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch) // expand switch ...
#define SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch)   SOME_USER_SPECIFIC_MACRO_##switch         // ... and select specific case

#define SOME_USER_SPECIFIC_MACRO_0  ... // not current user
#define SOME_USER_SPECIFIC_MACRO_1  ... // current user
Run Code Online (Sandbox Code Playgroud)

这可能吗?

编辑:让我澄清一下.假设每个程序员CURRENT_USER在其配置头中定义了不同的.当且仅当他们的user参数匹配时,我希望用户特定的宏扩展到有意义的东西CURRENT_USER.因为我希望那些宏包含_pragmas,它不能进行运行时检查(如下面的一些anwsers中所提出的).

编辑:再次,澄清.假设有宏来禁用某些代码段的优化:

#define TURN_OPTIMISATION_OFF __pragma …
Run Code Online (Sandbox Code Playgroud)

c c++ c-preprocessor

15
推荐指数
2
解决办法
1万
查看次数

为什么System.Exception.ToString不为内部异常调用虚拟ToString?

这是.NET的实际来源System.Exception.ToString:

public override string ToString()
{
  return this.ToString(true, true);
}

private string ToString(bool needFileLineInfo, bool needMessage)
{
  string str1 = needMessage ? this.Message : (string) null;
  string str2 = str1 == null || str1.Length <= 0 ? this.GetClassName() : this.GetClassName() + ": " + str1;
  if (this._innerException != null)
    str2 = str2 + " ---> " + this._innerException.ToString(needFileLineInfo, needMessage) + Environment.NewLine + "   " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack");
  string stackTrace = this.GetStackTrace(needFileLineInfo);
  if (stackTrace != null)
    str2 = str2 + …
Run Code Online (Sandbox Code Playgroud)

.net c# mono

9
推荐指数
1
解决办法
425
查看次数

如果调用未重写的虚方法,如何强制编译器错误?

在C++中编写模板基类时,这是一个关于样式和安全性的相当普遍的问题.但是,请耐心等待,最后有一个具体问题......

我有一个模板基类,当类型T是基本类型(int,float等)时,它完全实现了所需的功能.但是,如果T不是原始的(例如,如果T是需要使用一组特定参数调用的构造函数的类),则需要覆盖某些方法,因此将它们声明为虚拟模板.模板还包含一个纯虚方法,它强制它是抽象的,所以为了使用它必须从以下派生:基于基本类型的派生类可以使用提供的所有方法并仅覆盖纯虚拟方法,而基于非基本类型的派生类应覆盖所有虚方法.

例如:

template <typename T> class myTemplate
{
public:
    // Constructor:
    myTemplate<T>();

    // Destructor:
    virtual ~myTemplate();

    // General function, valid for all classes derived from this:
    void printMe()
    {
        printf("Hello, I'm from the template\r\n");
    }

    // Primitive function, must be overridden for non-primitive types:
    virtual T DoSomething(const T& myClass)
    {
        T result = result + static_cast<T>(1);
        return result;
    }

    // Primitive function, must be overridden for non-primitive types:
    virtual T DoSomethingElse(const T& myClass)
    {
        T result = …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates compiler-errors pragma

6
推荐指数
1
解决办法
1157
查看次数

标签 统计

c# ×2

c++ ×2

.net ×1

batch-file ×1

c ×1

c-preprocessor ×1

cmd ×1

compiler-errors ×1

inheritance ×1

mono ×1

pragma ×1

templates ×1

wpf ×1