Моя цель - создать исполняемый файл, который запустит теневое копирование приложения.Хитрость в том, что я хочу, чтобы эта стартовая программа не имела внешних зависимостей и не должна была содержать никаких сведений о программе, которую она должна запускать.
Я также хочу, чтобы она была единственным исполняемым файлом в каталоге.Другими словами, я хочу, чтобы он запускал сборку .dll, а не сборку .exe.(Я могу потребовать, чтобы имя файла .dll, загружаемого в новый домен приложений, всегда было одинаковым, например 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 [] argsв качестве аргументов, с пространством имен, без пространства имен, статическим / нестатическим классом и т. д.
Я смог изменить свой код для наследования от MarshalByRefObject, а затем использовать CreateInstance для создания объекта, но это выглядит такбудет более тесно связывать стартер с программой, которую предполагается запустить.Если бы я мог использовать ExecuteAssembly, запускаемое приложение просто нуждалось бы в статической пустоте Main, и это действительно просто и сложно испортить.
Возможно ли, чтобы сборка .dll имела точку входа по умолчанию,и для ExecuteAssembly, чтобы найти его, или я просто должен смириться с тем, чтобы идти другим путем?