2012-04-11 7 views
-2

Ich habe eine WinForms-Anwendung, die ich auch als eine Konsolenanwendung (mit 2 Befehlszeilenargumente) ausführen möchte.Machen WinForms-Anwendung WinForms/Console Hybrid

Ich versuchte den Ansatz von dieser Frage Behavior in WinForm/Console Hybrid Application. Aber in diesem Fall sind die Methoden der FormMain.cs (FormMain-Klasse) nicht von der Program-Klasse (Program.cs) aus zugänglich.

Wie soll ich den Code ändern, um die FormMain.cs-Methoden von der Programm.cs ausführen zu können?

UPD

Der Program.cs Code ist

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace Feature 
{ 

internal static class NativeMethods 
{ 
    [DllImport("kernel32.dll")] 
    internal static extern Boolean AllocConsole(); 
} 

static class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     if (args.Length == 0) 
     { 
      // run as windows app 
      Application.EnableVisualStyles(); 
      Application.Run(new FormMain(args)); 
     } 
     else 
     { 
      // run as console app 
      NativeMethods.AllocConsole(); 
      //??? How to access the methods of FormMain here ??? 
     } 
    } 
} 

}

Die FormMain.cs Code (i es ein wenig reduziert haben) ist

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Collections; 
using System.Xml.XPath; 
using System.Xml; 
using Microsoft.Office.Interop.Excel; 
using System.Reflection; 

namespace Feature 
{ 
public partial class FormMain : Form 
{ 
    public FormMain(string[] Args) 
    { 
     InitializeComponent(); 
    } 

    public ArrayList Errors = new ArrayList(); 

    public ArrayList GetDirectoriesRecursively(string startPath) 
    { 
     string[] oNewDirectories = Directory.GetDirectories(startPath); 
     ArrayList oDirectories = new ArrayList(); 
     ArrayList oDirectoriesNewList; 

     foreach (string oCurrent in oNewDirectories) 
     { 
      oDirectories.Add(oCurrent); 
      oDirectoriesNewList = GetDirectoriesRecursively(oCurrent); 
      if (oDirectoriesNewList.Count > 0) oDirectories.AddRange(oDirectoriesNewList); 
     } 
     return oDirectories; 
    } 

    public ArrayList GetFilesInFolder(string startPath, string pattern) 
    { 
     string[] oNewFiles = Directory.GetFiles(startPath, pattern); 
     ArrayList oFiles = new ArrayList(); 
     foreach (string oCurrent in oNewFiles) 
      oFiles.Add(oCurrent); 
     return oFiles; 
    } 
} 

}

+3

Bitte schreiben Sie den Code. –

+0

Siehe meine Antwort hier: http://stackoverflow.com/questions/9620436/is-it-possible-to-have-savefiledialog-in-windows-console-applications/9620534#9620534 –

Antwort

2

Sie an dieser rückwärts suchen werden: Statt der Hoffnung, den Zugriff auf Ihre nützlichen Funktionen in Form.cs gefunden zu bekommen - wenn sie es so nützlich - Sie sollten stattdessen bewegen sie ein externer Ort, an dem Sie ihre Zugänglichkeit leichter kontrollieren können.

+0

Danke! Das hat mein Problem gelöst. Ich habe die allgemein gebräuchlichen Methoden als öffentliche Methoden in eine separate Klasse verschoben. Dann kann auf diese Methoden sowohl von Formular als auch von Programm zugegriffen werden. – andrey1492