Сколько усилий вы готовы приложить для этого?
Способ, которым Windows знает, где находится точка входа для исполняемого файла, в поле AddressOfEntryPoint структуры _IMAGE_OPTIONAL_HEADER вPE заголовок файла.Я не эксперт, но я считаю, что Dotnet CLI также использует это.Поскольку поле AddressOfEntryPoint является просто байтовым смещением в файле, невозможно иметь точку входа в другом файле.
Один способ, которым это может работать (я не проверял), - это если ваш исполнитель заданий являетсяОтлично, не dll, внутри nupkg.Таким образом, когда каждое задание создается (и, если необходимо, с помощью dotnet cli, также публикуемого), выходная папка будет содержать исполняемый файл исполняемого задания.Само задание может быть dll, поэтому ему не нужна собственная точка входа.Но вашему руководителю работы все равно нужно будет использовать отражение для загрузки всех сборок, что, я согласен, является плохой идеей.Он также не позволяет dotnet run
работать над проектом рабочих задач, что значительно усложняет отладку для людей, реализующих рабочие места.
Другой вариант - просто сказать разработчикам рабочих задач включить однострочный метод Main в их exe
public static void Main()
{
JobRunner.Run();
}
Для этого также требуется, чтобы JobRunner использовал рефлексию для поиска работы, но по крайней мере вы могли бы использовать Assembly.GetCallingAssembly()
или Assembly.GetEntryAssembly()
, чтобы избежать загрузки всех библиотек.Вы можете изменить JobRunner.Run()
на JobRunner.Run(Type)
или JobRunner.Run<T>() where T : IJob
, чтобы разработчики заданий сообщали исполнителю заданий, какое именно задание следует запускать в своем собственном методе Main, и избегайте выполнения шага 2 в задании.Это похоже на то, как приложения ASP.NET Core имеют аналогичный, если не идентичный, Program.Main, так что это не совсем беспрецедентно.
Если вы хотите максимально упростить процесс реализации ваших заданий, вы могли быВдохновитесь тем, как .NET Core создает временные файлы .cs в папках obj/$(Configuration)/
.Создайте свой пакет nuget с соответствующим файлом msbuild .targets и попросите ваш пользовательский целевой файл msbuild создать другой временный файл .cs в файле obj, который содержит точку входа Main (), и иметь файл .csвключены для компиляции.
Для дополнительного кредита вы можете использовать Roslyn для анализа всех не временных файлов .cs в проекте, найти все задания, а затем в созданном вами файле .cs вызвать метод Main вашего JobRunner с помощьюобнаруженный тип (типы), поэтому во время выполнения не нужно использовать отражение для выполнения шага 2.