小编Tre*_*edd的帖子

StandardOutput.EndOfStream挂起

我正在我的C#应用​​程序中启动一个运行控制台应用程序的进程.我重定向了标准输入和输出,并且能够通过StandardOutput.ReadLine()读取几行.我确信我已正确配置ProcessStartInfo.

控制台应用程序启动时会输出几行(以"marker"行结尾),然后等待输入.收到输入后,它再次输出几行(再次以"标记"行结束),依此类推.我的目的是从它读取行直到我收到"标记"行,此时我知道发送适当的输入字符串.

我的问题是,经过几次迭代,程序挂起.暂停调试器往往会将挂起置于对StandardOutput.EndOfStream的调用中.以下测试代码就是这种情况:

while (!mProcess.StandardOutput.EndOfStream) // Program hangs here.
{
    Console.WriteLine(mProcess.StandardOutput.ReadLine());
}
Run Code Online (Sandbox Code Playgroud)

当我测试"marker"行时,如果我在读取行后尝试访问StandardOutput.EndOfStream,我会得到同样的挂起:

string line = "";
while (!isMarker(line))
{
    line = mProcess.StandardOutput.ReadLine();
}
bool eos = mProcess.StandardOutput.EndOfStream; // Program hangs here.
Run Code Online (Sandbox Code Playgroud)

我可能会做什么导致这个属性如此可怕地执行?

c# hang

4
推荐指数
1
解决办法
6210
查看次数

使用dllexport和特定函数名称时未解析的外部符号

编辑

为了解决这个问题,我将以下内容添加到头文件的开头:

#ifdef GetMessage
#undef GetMessage
static inline BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
) {
#if UNICODE
return ::GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#else
return ::GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#endif
}
#endif
Run Code Online (Sandbox Code Playgroud)

我正在从以下代码创建一个C++ DLL(使用Visual Studio 2008):

头文件:

#include <windows.h> // Edit: This is the culprit.
class __declspec(dllexport) TestBaseClass
{
protected:
   char m_Message[512];
public:
   TestBaseClass();
   virtual char* GetMessage(void) = 0;
};

class __declspec(dllexport) TestDerivedClass : public TestBaseClass
{
public:
   TestDerivedClass();
   virtual char* GetMessage(void);
};
Run Code Online (Sandbox Code Playgroud)

CPP文件:

TestBaseClass::TestBaseClass()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ dll dllexport

2
推荐指数
2
解决办法
1386
查看次数

标签 统计

c# ×1

c++ ×1

dll ×1

dllexport ×1

hang ×1