을 AllocConsole 및 AttachConsole과주의 사항을이 함께 약간의 재생 및 본 후, 나는 생각한다 가장 좋은 방법은 두 개의 .NET exe 파일, 즉 foo.exe 및 fooconsole.exe를 사용하는 것입니다. 콘솔 출력이 필요하면 fooconsole.exe를 사용하십시오.
주요 기능 이외의 모든 코드는 DLL (클래스 라이브러리)을 생성하는 .NET 프로젝트에 배치 할 수 있습니다. 이것은 메인 윈도우를 포함하여 모든 win 폼을 포함합니다. exe 프로젝트에 남아있는 유일한 것은 차례대로 DLL에서 정적 함수를 호출하는 작은 주 기능입니다. 이 모든 작업은 P-Invoke에 의지하지 않고 수행 할 수 있습니다. 당신의 DLL 클래스 라이브러리에서
다음을 방출 프로젝트에서
using System;
namespace MyNamespace
{
static class Program
{
[STAThread]
static int Main(string[] args)
{
return MainEntry.DoMain(args, false);
}
}
}
: 윈도우 EXE (에서 foo.exe)을 방출하는 프로젝트에서
using System;
using System.Windows.Forms;
namespace MyNamespace
{
public class MainEntry
{
private static bool mIsConsole = false;
private MainEntry() { }
public static bool IsConsoleApp
{
get { return mIsConsole; }
}
public static int DoMain(string[] args, bool isConsole)
{
mIsConsole = isConsole;
try
{
// do whatever - main program execution
return 0; // "Good" DOS return code
}
catch (Exception ex)
{
if (MainEntry.IsConsoleApp)
{
Console.Error.WriteLine(ex.Message);
}
else
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return 1; // "Bad" DOS return code indicating failure
}
}
}
}
,이 유일한 코드 모두 EXE 프로젝트에서, 당신은 referen 필요 물론
using System;
namespace MyNamespace
{
static class Program
{
[STAThread]
static int Main(string[] args)
{
return MainEntry.DoMain(args, true);
}
}
}
: 콘솔 EXE (fooconsole.exe)는,이 유일한 코드 ce 같은 솔루션에서 DLL 프로젝트에. 프로젝트 속성의 응용 프로그램 탭에서 프로젝트 유형 (Windows 응용 프로그램 (EXE), 콘솔 응용 프로그램 (EXE) 또는 클래스 라이브러리 (DLL))을 변경할 수 있습니다.
EXE 파일이 창이나 콘솔 서브 시스템을 사용하는지 프로그램 적으로 결정할 수는 있지만 P-Invoke가 많을 수도 있으므로 EXE 파일의 PE 헤더 바이트를 살펴 봐야합니다. .
또한, 명령 행이나 배치 파일에서 프로그램을 실행하고 출력 (stdout 및/또는 stderr)을 파일로 리디렉션하려고하면 AllocConsole/AttachConsole 메소드가 재미 있습니다. - 파일에는 가지 않을거야. http://www.nabble.com/WIN32:-Spawning-a-command-line-process-td21681465.html
또 다시 해결할 수는 있지만 더 많은 P-Invoke가 필요하며 그만한 가치는 없을 것입니다.
모범 사례로 DLL에서 정적 함수를 호출하는 간단한 Main 함수보다 EXE 프로젝트에 더 많은 것을 넣지 않았습니다. 많은 이유가 있지만 단 하나의 좋은 이유는 단위 테스트 도구가 EXE보다 DLL에서 더 잘 작동한다는 것입니다.
또한 args의 문자열 배열을 취하고 int를 반환하는 Main 함수의 형식에 유의하십시오. 배치 파일에서 ERRORLEVEL을 사용하면 EXE가 반환하는 모든 번호 (일반적으로 성공시 0, 실패시 0보다 큰 숫자)로 작업 할 수 있으므로이 형식을 사용하는 것이 가장 좋습니다.
콘솔도 제대로 연결하지 못합니다. – Malfist
가끔은 (!!?) 콘솔에 연결되지 않습니다. 이것은 관리 권한/etc와의 몇 가지 상호 작용 일 수 있습니다. 작동하지 않는 경우 cmd.exe를 다시 시작하면 도움이 될 수 있습니다. –