Моя цель — создать исполняемый файл, который будет запускать приложение с теневой копией. Хитрость в том, что я хочу, чтобы эта стартовая программа не имела внешних зависимостей и не должна была содержать никаких сведений о программе, которую она должна запустить.
Я также хочу, чтобы это был единственный исполняемый файл в каталоге. Другими словами, я хочу, чтобы он «запускал» сборку .dll, а не сборку .exe. (Я могу потребовать, чтобы имя файла .dll, загружаемого в новый AppDomain, всегда было одинаковым, например, Main.dll или что-то в этом роде.)
Похоже, что AppDomain.ExecuteAssemblyподойдет именно то, что я хотел.В нем говорится, что он начнет выполнение в «точке входа, указанной в заголовке .NET Framework».
Когда я пытаюсь использовать эту функцию, я получаю сообщение об ошибке «Точка входа не найдена в сборке «DllApp»».
Начальная программа, которая у меня есть, просто пытаюсь запустить сборку:
static void Main()
{
AppDomain domain = AppDomain.CreateDomain( "DllApp" );
domain.ExecuteAssembly( "DllApp.dll" );
}
Код приложения в файле .dll с точкой входа по умолчанию:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new Form1() );
}
}
Эта страница о функциях Main()говорит, что «Библиотеки и службы не требуют метода Main в качестве точки входа». Это не говорит, что они не могутиметь точку входа по умолчанию.
Я перепробовал все различные сочетания public/private static void main, тип возвращаемого значения int, аргументы string[] в качестве аргументов, с пространством имен, без пространства имен, статический/нестатический класс и т. д.
I смог изменить мой код, чтобы он наследовал от MarshalByRefObject, а затем использовал CreateInstance для создания объекта, но похоже, что он будет более тесно связывать стартер с программой, которую он должен запускать. Если бы я мог использовать ExecuteAssembly, запускаемому приложению просто понадобился бы static void Main, а это действительно просто и трудно испортить.
Возможно ли, чтобы сборка .dll имела точку входа по умолчанию и чтобы ExecuteAssembly мог ее найти, или мне просто нужно смириться и пойти другим путем?