2010-04-18 6 views
1

MSDN에서 아티클을 사용하여 만든 약간의 사용자 지정 C# 컴파일러가 있습니다.CodeDomProvider를 사용하여 명령 프롬프트 숨김

그러나 샘플 컴파일러를 사용하여 새 Windows Forms 응용 프로그램을 만들면 MSDOS 창이 나타나고 DOS 창을 닫으면 WinForms 응용 프로그램도 닫힙니다. 컴파일러에게 어떻게 알릴 수 있습니까? MSDOS 창을 전혀 표시하지 않으시겠습니까?

감사합니다 :)

여기 내 코드입니다 :/대상 스위치가 exe 인이 때 표시되는

using System; 

namespace JTS 
{ 
    public class CSCompiler 
    { 
     protected string ot, 
      rt, 
      ss, es; 

     protected bool rg, cg; 

     public string Compile(String se, String fe, String[] rdas, String[] fs, Boolean rn) 
     { 
      System.CodeDom.Compiler.CodeDomProvider CODEPROV = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp"); 
      ot = 
       fe; 

      System.CodeDom.Compiler.CompilerParameters PARAMS = new System.CodeDom.Compiler.CompilerParameters(); 
      // Ensure the compiler generates an EXE file, not a DLL. 
      PARAMS.GenerateExecutable = true; 
      PARAMS.OutputAssembly = ot; 
      PARAMS.CompilerOptions = "/target:winexe"; PARAMS.ReferencedAssemblies.Add(typeof(System.Xml.Linq.Extensions).Assembly.Location); 
      PARAMS.LinkedResources.Add("this.ico"); 

      foreach (String ay in rdas) 
      { 
       if (ay.Contains(".dll")) 
        PARAMS.ReferencedAssemblies.Add(ay); 
       else 
       { 
        string refd = ay; 
        refd = refd + ".dll"; 
        PARAMS.ReferencedAssemblies.Add(refd); 
       } 

      } 

      System.CodeDom.Compiler.CompilerResults rs = CODEPROV.CompileAssemblyFromFile(PARAMS, fs); 

      if (rs.Errors.Count > 0) 
      { 
       foreach (System.CodeDom.Compiler.CompilerError COMERR in rs.Errors) 
       { 
        es = es + 
         "Line number: " + COMERR.Line + 
         ", Error number: " + COMERR.ErrorNumber + 
         ", '" + COMERR.ErrorText + ";" + 
         Environment.NewLine + Environment.NewLine; 
       } 
      } 
      else 
      { 
       // Compilation succeeded. 
       es = "Compilation Succeeded."; 

       if (rn) System.Diagnostics.Process.Start(ot); 
      } 
      return es; 
     } 
    } 
} 
+1

DOS! = 명령 프롬프트 –

+0

죄송합니다, 실수. 고맙습니다. :) –

답변

4

C# 컴파일러 콘솔 창에서./target = winexe이면 콘솔 창이 표시되지 않습니다. http://msdn.microsoft.com/en-us/library/6h25dztx.aspx

이 시도 :

 
System.CodeDom.Compiler.CompilerParameters PARAMS = new System.CodeDom.Compiler.CompilerParameters(); 

PARAMS->CompilerOptions = "/target:winexe"; 

참조 : 당신이 AssemblyBuilder를 사용하는 경우 MSDN의 기사 당신이 언급하는 나도 몰라 http://msdn.microsoft.com/en-us/library/system.codedom.compiler.compilerparameters.compileroptions.aspx

+0

이러한 속성은 어디에서 변경할 수 있습니까? 내 질문에 내 코드를 게시했습니다. 감사합니다 –

+0

감사합니다 힙! 그러나 여전히 명령 프롬프트 창이 표시됩니다. –

+1

죄송합니다. 다음과 같아야합니다 :/target : winexe –

1

하지만 다음 "마법"에 SetEntryPoint으로 전화하십시오. 나는 AssemblyBuilder 생각하지만 자동으로 지정하지 않은 경우가 DLL을의 가정

var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(
    new AssemblyName(assemblyName), AssemblyBuilderAccess.Save); 
var mod = asm.DefineDynamicModule(assemblyName, fileName);   
var type = mod.DefineType("Program", 
    TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.Public); 
var mainMethod = type.DefineMethod("Main", 
    MethodAttributes.Public | MethodAttributes.Static); 
// ... Code for Main method and the rest ... 
type.CreateType(); 
asm.SetEntryPoint(mainMethod,PEFileKinds.WindowApplication); 
asm.Save(fileName); 

다른 PEFileKinds이 ConsoleApplication 및 DLL이 있습니다 : 당신이 윈도우 폼 응용 프로그램이있는 경우

, 당신은 PEFileKinds.WindowApplication를 지정해야 EntryPoint.

+0

자세한 답변을 해주셔서 감사합니다. 지금 사용해 보겠습니다. 다음은 내가 언급 한 MSDN 기사에 대한 링크입니다. http://support.microsoft.com/kb/304655 –

+0

코드를 잘못된 위치에 붙여 넣지 않는 한, 정확히는 그렇지 않을 수도 있다는 느낌을 조금 듭니다. 그것이 전혀 효과가 없었기 때문에 관련성이 있어야합니다. 컴파일러 작성 방법을 볼 수 있도록 코드를 편집하기 위해 제 질문을 참조하십시오. :) –

+0

아, CodeDom을 사용하고 있습니다. 아니요, 코드가 작동하지 않습니다. 코드 예제를보고 사용하기 전에 확실하지 않았습니다. –