2016-06-12 3 views
0

Как я буду читать ввод данных, обрабатывать события com и вызывать определенные функции объекта com из пользовательского ввода в консольном приложении?C# console - вызов и прослушивание событий com

Я пытаюсь собрать воедино следующее:

static void Main(string[] args) 
{ 
    // Read user input 
    string input; 

    do 
    { 
     // Start thread for com here?? 

     input = Console.ReadLine(); 

     if (input == "Function1") 
     { 
      // Call Function1 on Com object 
     } 

     if (input == "Function2") 
     { 
      // Call Function2 on Com object 
     } 

    } while (input != null); 

    // Exit app 
} 

-

// Call com on separate thread 
Thread thread = new Thread(MessagePumpThread); 
thread.IsBackground = true; 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

-

void MessagePumpThread() 
{ 
    var activex = new activeXObject(); 
    activex.CreateControl(); 

    // Subscribe to events... 

    Application.Run(); 
} 

я принципиально хочу делать то, что легко сделать в Windows Form Application, но в консоли.

Любая помощь с благодарностью, спасибо.

+1

Если вы еще не сделали, вы, вероятно, следует рассмотреть [потоковую модель Apartment] СОМ (https://msdn.microsoft.com/en-us/library/ms809971 .aspx). – theB

ответ

1

Я получил то, что хотел работать со следующим кодом. Сначала я импортировал элемент управления activex в приложение формы Windows, чтобы создать оболочку dll, которую я тогда использовал в консольном приложении. https://msdn.microsoft.com/en-us/library/ms973200.aspx

class Program 
{ 
    private static activeXControl _acx = new activeXControl(); 

    [STAThread] 
    static void Main(string[] args) 
    { 
     // User input loop thread, use Ctrl + Z to exit loop 
     Thread thread = new Thread((ThreadStart) 
     delegate 
     { 
      string input; 

      do 
      { 
       input = Console.ReadLine(); 

       if (string.IsNullOrEmpty(input)) 
       { 
        continue; 
       } 

       switch (input) 
       { 
        case "Function1": 
         acx.Invoke(new Action(() => _acx.Function1())); 
         break; 

        case "Function2": 
         acx_.Invoke(new Action(() => acx_.Function2())); 
         break; 

        default: 
         Console.WriteLine("Method not found"); 
         break; 
       } 
      } while (input != null); 
     }); 
     thread.IsBackground = true; 
     thread.Start(); 

     // Create control and subscribe to events 
     _acx.CreateControl(); 

     _acx.Event1 += new System.EventHandler(acx_Event1); 
     _acx.Event2 += new System.EventHandler(acx_Event2); 

     // Start message loop 
     Application.Run(); 
    } 

    private static void acx_Event1(object sender, EventArgs e) 
    { 
     // Write event output to console 
    } 

    private static void acx_Event2(object sender, EventArgs e) 
    { 
     // Write event output to console 
    } 
} 

Надеюсь, что это помогает кому-то

Смежные вопросы