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

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

Я также хочу, чтобы это был единственный исполняемый файл в каталог. Другими словами, Я хочу, чтобы он" запускал " a .dll сборка не an .exe сборки. (Я могу потребовать, чтобы имя .dll-файл, загружаемый в новый AppDomain, будет таким же каждый раз, как Главный.dll или что-то в этом роде.)

похоже AppDomain.ExecuteAssembly сделал бы именно то, что я хотел. В нем говорится, что он начнет выполнение в "точке входа, указанной в заголовке .NET Framework.".

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

начальная программа у меня есть, просто пытаюсь запустить сборку:

static void Main()
{
    AppDomain domain = AppDomain.CreateDomain( "DllApp" );
    domain.ExecuteAssembly( "DllApp.dll" );
}

код приложения, в a .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, запускаемое приложение просто нуждалось бы в static void Main, и это действительно просто и сложно испортить.

возможно ли это для a .сборка dll, чтобы иметь точку входа по умолчанию, и для ExecuteAssembly, чтобы найти ее, или мне просто нужно уйти в отставку на другой маршрут?

3 ответов


вы можете скомпилировать приложение .NET как exe (который является сборкой) и переименовать его в.DLL и он будет действовать как обычный .NET .сборка dll. Тогда у него будет ваша точка входа.


Я нашел совет не так легко следовать. После некоторых экспериментов я пришел к успеху:

Я создал консольное приложение с простым main и включил остальную часть кода из моей оригинальной DLL. Ниже приведена упрощенная программа, которая включает в себя DLL:

namespace FIT.DLLTest
{
  public class DLLTest
  {
    [STAThread]
    static void Main(string[] args)
    {
      int a = 1;
    }

    public DLLTest()
    {
      int b = 17;
    }

    public int Add(int int1, int int2)
    {
      return int1 + int2;
    }
  }
}

после компиляции я переименовал созданный .exe к a .файл DLL.

в материнской программе, которая использует DLL, я сначала добавил DLLTest.dll в качестве ссылки, затем я добавил код выполните DLL.

namespace TestDLLTest
{
  class TestDLLTest
  {
    static void Main(string[] args)
    {
      AppDomain domain = AppDomain.CreateDomain( "DLLTest" );
      domain.ExecuteAssembly( "DllTest.dll" );

      DLLTest dt = new DLLTest();
      int res2 = dt.Add(6, 8);
      int a = 1;
    }
  }
}

Violà я мог бы выполнить и добавить точку останова в DLLTest.Main метод и посмотреть, что я могу вызвать Main из DLLTest. Спасибо за обсуждение, ребята!


короткий ответ-нет. ля. DLL-файл представляет собой динамически связанную библиотеку, которая вызывается другой библиотекой. Думаю, то, что сказал Кит, технически сработает.. вероятно, вы могли бы переименовать его в то, что вы хотите еще .txt или .pdf, пока вы запускаете приложение надлежащим образом. Главный вопрос, который у меня есть: что вы пытаетесь сделать?? Если вы не пытаетесь написать вредоносное ПО, зачем вам это делать? Не то, чтобы я потворствовал написанию вредоносных программ для плохих целей, но я знаю люди любят экспериментировать в собственной лаборатории, поэтому я не осуждаю это. Если вы пишете вредоносное ПО, что-то вроде c++, C или assembler, может быть, лучше, я думаю, что C# может выполнить работу, но meh...