2017-01-27 3 views
0

У меня есть два проекта в одном решении: Project (A) и Project (B).Как закрыть заявку по ссылке?

Я импортировал Project (A) в Project (B), поэтому по существу я могу управлять A от B. Теперь, когда я закрываю окно проекта B, представляющего основной проект, мне нужно закрыть окно проекта A.

В проекте B когда OnClosed события обожженное исполняет это:

protected override void OnClosed(EventArgs e) 
{ 
    Environment.Exit(0); 
} 

проблема это, что проект B остается открытым. Как я могу решить это без создания какого-либо экземпляра проекта A внутри B?

Спасибо.

+1

Являются ли они оба исполняемыми проектами (клиент WinForms, WPF, консольное приложение)? Вы не можете ожидать, что один исполняемый файл закроет другой ... они представляют собой отдельные исполняемые файлы. Можете ли вы описать больше о том, что делаете? Можете ли вы показать соответствующий код для того, где вы создаете экземпляры каждого из них? –

+0

Я сильно подозреваю, что ответ на это зависит от того, как B создал/управляет A – BradleyDotNET

+0

@ rory.ap Да оба являются двумя приложениями wpf, извините, что я забыл упомянуть в моем вопросе. В любом случае все зависит от проекта B – AgainMe

ответ

0

Вы можете выполнить итерацию по запущенным процессам и закрыть процесс по имени.

var processes = System.Diagnostics.Process.GetProcesses(); 
    foreach(var process in processes) 
    { 
     Console.WriteLine(process.ProcessName); 
     if(process.ProcessName == "NameOfProcessToClose") 
     { 
      process.CloseMainWindow(); 
     } 
    } 

Есть и другие механизмы межпроцессного взаимодействия, которые вы можете использовать. Установите IP-сокет, именованный канал или общий ресурс файла, чтобы сообщить о завершении работы другому процессу.

+0

«Mutex» также будет работать –

+0

Да, я собирался упомянуть мьютекс, но я не помню, могли ли mutex'ы генерировать события или если «приемник» должен опросить мьютекс – Frode

+0

Нет другого способа добиться этого? – AgainMe

0

Вы можете использовать CrossAppDomainDelegates для удаленного выполнения кода в другом приложении.
Вот пример, чтобы вы начали:

namespace ApplicationB 
{ 
    /// <summary> 
    /// Interaction logic for App.xaml 
    /// </summary> 
    public partial class App : Application 
    { 
     private SecondaryAppHelper _secondaryApp; 

     protected override void OnStartup (StartupEventArgs e) 
     { 
      _secondaryApp = new SecondaryAppHelper (); 
     } 

     protected override void OnExit (ExitEventArgs e) 
     { 
      _secondaryApp.Dispose (); 
     } 
    } 

    sealed class SecondaryAppHelper : IDisposable 
    { 
     private const string _secondaryDomainName = "ApplicationA Domain"; 
     private AppDomain _domain; 

     public SecondaryAppHelper () 
     { 
      var setup = new AppDomainSetup () { ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase, 
               ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, // Here we share the same app.config 
               ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName, 
               LoaderOptimization = LoaderOptimization.MultiDomainHost }; 

      _domain = AppDomain.CreateDomain (_secondaryDomainName, null, setup); 

      // Let's ask our new domain to launch ApplicationA 
      // Without creating a new domain, the two WPF windows would share the same render thread. 
      _domain.DoCallBack (() => 
       { 
        var thread = new Thread (() => 
        { 
         var app = new ApplicationA.App (); 
         var win = new ApplicationA.MainWindow (); 

         app.MainWindow = win; 

         app.Startup += (sender, e) => { (sender as ApplicationA.App).MainWindow.Show (); }; 
         app.Run (); 
        }); 

        thread.SetApartmentState (ApartmentState.STA); // Necessary for WPF & WinForms 
        thread.IsBackground = true; // The thread will terminate itself nicely after the app closes 
        thread.Start (); 
       }); 
     } 

     public void Dispose () 
     { 
      _domain.DoCallBack (() => 
       { 
        if (Application.Current != null) 
        { 
         EventHandler handler = null; 

         handler = (sender, e) => 
          { 
           var dispatcher = sender as Dispatcher; 
           dispatcher.ShutdownFinished -= handler; // Better safe than sorry 

           AppDomain.Unload (AppDomain.CurrentDomain); 
          }; 

         Application.Current.Dispatcher.ShutdownFinished += handler; 

         Application.Current.Dispatcher.BeginInvokeShutdown (DispatcherPriority.Background); 
        } 
       }); 
     } 
    } 
} 
-1

Решение очень просто:

1) В проекте (б) правой кнопкой мыши на ссылки и нажмите Добавить ссылку

2) Выберите проект (а) в проекты

3) на этом этапе нам нужно создать экземпляр проекта А внутри в, так:

public static ProjectA.MainWindow projectA; 

4) В этот момент, когда вам необходимо открыть приложение проекта А, например, при нажатии кнопки Пункт в меню:

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    projectA = new ProjectA.MainWindow(); 
} 

это откроет Projecta, так что для закрытия этого вместо этого мы должны создать метод в PROJECTA:

public void Exit() 
{ 
    Close(); //Implicit declaration of Window.Close(); 
} 

так, в проекте B:

projectA.Exit(); 

будет shutdow n всего приложения. Как вы можете видеть, бесполезно в этом случае использовать класс Mutex или много кода для достижения этой простой задачи.

Надеюсь, что помощь ..

+0

'new ProjectA.MainWindow(). Exit()' не выходит из уже запущенного экземпляра ProjectA, который вы хотели сделать в соответствии с вашим вопросом. – CodeCaster

+0

@CodeCaster лучше прочитал мой ответ, код, который я написал, делает именно то, что мне нужно делать. Попробуйте сами, вместо того, чтобы потерять время, чтобы положить downvote;) – AgainMe

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