Может ли сборка C# .dll содержать точку входа?

Моя цель — создать исполняемый файл, который будет запускать приложение с теневой копией. Хитрость в том, что я хочу, чтобы эта стартовая программа не имела внешних зависимостей и не должна была содержать никаких сведений о программе, которую она должна запустить.

Я также хочу, чтобы это был единственный исполняемый файл в каталоге. Другими словами, я хочу, чтобы он «запускал» сборку .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 мог ее найти, или мне просто нужно смириться и пойти другим путем?

17
задан Sean 6 March 2012 в 03:35
поделиться