Запуск основного проекта .net из другого проекта - PullRequest
13 голосов
/ 27 июня 2019

У меня есть решение, которое имеет 3 проекта.Project2 нужен Project1 для нормальной работы (Project2 вызывает Apis в Project1).

Solution
|-- Project1
|   |-- Program.cs
|   |-- Startup.cs
|-- Project2
|   |-- Program.cs
|   |-- Startup.cs
|-- IntegrationTestProject

Я могу запустить 2 проекта вместе, изменив свойства решения, как показано на рисунке ниже, ивсе работало нормально:

enter image description here

Мне нужен способ запуска Project1 из Project2 по коду (из запуска или из SomeService в Project2), и он будетбыло бы здорово, если бы я мог также остановить Project1, когда я перестал запускать Project2.

Я попробовал этот код, и он не запустил Project1:

  string[] x = { };
  Project1.Program.Main(x);

Редактировать:

IntegrationTestProject используется для тестирования Project2 Apis.Поэтому я создал new TestServer() из Project2.

Когда я запускаю интеграционный тест, некоторые API успешно (тот, который зависит только от Project2), а другие (тот, который вызывает Apis из Project1), потому что сервер (Project1) недоступен (он не работает)при выполнении теста).

Если я запускаю интеграционный тест во время выполнения Project1, все тесты пройдены успешно.

Я попытался запустить тестовый экземпляр Project1 с помощью new TestServer() и передать его в Project2.Это работало для некоторых Apis, и я столкнулся с другой проблемой, которая, казалось, не была решена, пока я не запустил Project1, а не его тестовый экземпляр.

Поэтому мое единственное решение - запустить Project1, когда я запускаю интеграционный тест.1030 *

Я создал .bat-файл, который запускает Project1 (с помощью dotnet), а затем запускает интеграционный тест (с помощью dotnet), и он работает нормально.Но проблема в том, что при запуске интеграционного теста из Visual studio он не запускал Project1.

Edit 2:

Это пример проекта, который демонстрируетпроблема, с которой я столкнулся: https://github.com/bilalseh/SampleSolution

1 - Если вы запустите Project2 в одиночку и вызовете (Get: "/ api / home"), он вернет результат.Если вы позвоните (Get: "/ api / home / 5"), у него возникнет проблема, поскольку этот Api зависит от Project1.

2- Если вы откроете Visual Studio и запустите тесты (2 теста) или запустите эти тесты из командной строки с помощью «dotnet test», то 1 тест пройдет (тестирование: «/ api / home») и одинпотерпит неудачу (тестирование: "/api/home/5").

3- Если вы запустите Project1, а затем запустите тесты, оба пройдут.

4- Я сделал .bat файлс именем «запустить тест с временным сервером .bat» в папке тестирования интеграции.Этот файл запускает Project1, затем запускает тесты и затем останавливает Project1.Если вы запустите этот файл, оба теста пройдут.

Мне нужно найти способ запустить Project1 либо из Project2, либо когда я начну интеграционный тест.

Ответы [ 2 ]

8 голосов
/ 27 июня 2019

Вы либо добавляете ссылку на сборку проекта, который хотите запустить.

Другой способ будет с Process.Start() и указанием пути к исполняемому файлу для его запуска

По проекту, который хотите открыть другой проект:

Щелкните правой кнопкой мыши Ссылки -> Добавить ссылки -> Решение -> отметьте проект, который вы хотите создать -> OK

Вам может потребоваться добавить дополнительные ссылки, если компилятор попросит вас (PresentationFramework, system.xaml ...) или сделать Project 2 Program.cs общедоступным, добавив слово «public» перед «class Program».

и добавить это В Project 1 кнопка ...

private void button_Click(object sender, EventArgs e)
{
    Project_2 pb = new Project_2()
    Process.Start(pb.returnPath() + \\"Project_2.exe");
}

РЕДАКТИРОВАТЬ: Когда я ищу в stackoverflow, ваш вопрос похож на этот one

5 голосов
/ 01 июля 2019

Похоже, вы хотите пойти в микросервис.Итак, пара принципов:

1) у вас должна быть возможность отладки сервисов по одному - если вы отлаживаете сервис A, который зависит от сервиса B, создайте фиктивный сервис B. Затем протестируйте / отладьте сервис Bсам по себе - если все части работают, вся машина должна работать

2), если вы хотите выполнить RUN (а не просто отладку), используйте для этого Docker / Kubernetes.Они будут управлять любыми перезапусками, сбоями, обновлениями и т. Д. Если вы хотите протестировать всю систему, все равно запустить развертывание docker, а затем запустить интеграционные тесты на этом

Каждый микросервис - это свое дело, без какой-либо реальной зависимости от других.поэтому нет общих баз данных, нет перекрестных ссылок через DLL и т. д.

Если вам кажется, что это излишне, не разбивайте свое приложение на микросервисы, создайте один большой сервис - им будет легче управлять.По крайней мере, до определенного момента, когда гранулярность показывает свою доброту

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...