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