سؤال

أحاول اكتشاف طريقة لعملية قليلة من الأشياء قبل تحميل تطبيق WinForm الخاص بي. حاولت وضع الفراغ الثابت () في نموذج داخل مشروع مكتبة الفصل وعلقت عليه من البرنامج. الذي يولد خطأ في وقت الترجمة: "... لا يحتوي على طريقة" رئيسية "ثابتة مناسبة لنقطة الدخول". من المنطقي لأنه لم يتم تحميل البرنامج ، لم يتم تحميل DLL أيضًا.

لذا فإن السؤال هو ، هل هناك طريقة للقيام بذلك على الإطلاق؟ أريد أن يكون النموذج الموجود في DLL قادرًا على تحديد النموذج المطلوب تشغيل التطبيق بـ:

[STAThread]
static void Main()
{
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);

   if(condition1)
   {
      Application.Run(new Form1());
   }
   else if(condition2)
   {
      Application.Run(new Form2());
   }
}

سيتم استخدام هذا المنطق في أكثر من تطبيق واحد ، لذا فمن المنطقي وضعه في مكون مشترك.

هل كانت مفيدة؟

المحلول

هل يمكنك فقط إضافة طريقة ثابتة في DLL الخاصة بك والتي يتصل بها التطبيق بدلاً من إجراء المعالجة بشكل رئيسي؟

// In DLL
public static class ApplicationStarter
{
     public static void Main()
     {
          // Add logic here.
     }
}

// In program:
{
     [STAThread]
     public static void Main()
     {
          ApplicationStarter.Main();
     }
}

نصائح أخرى

تبقيك الطريقة الرئيسية في البرنامج. دعها تستدعي طريقة في DLL التي تقوم بتثبيت نموذج بناءً على الحالة وإعادته إلى MAIN.

يجب أن تكون طريقة "static void الرئيسية" ضمن مجموعة "exe" ، ولكن يمكنك إجراء هذه الطريقة على إصدار تجميعك المشترك من "Main". لا يمكنك فعل ذلك مباشرة.

لا معنى له في مكتبة الفصل الدراسي الثابت في مكتبة الفصل ، ومع ذلك ، يجب أن يفعل مقتطف من الكود الخاص بك ما تريده بالضبط إذا تم وضعه في البرنامج.

أيضًا ، هل تحتاج إلى جملة "Catch-Coll" ، فقط في حالة الحالة 1 و inction2 لم يتم الوفاء بها؟ قد لا تكون مطلوبة ، لكن في معظم الحالات ، أتوقع شكلاً من أشكال التعليقات بدلاً من الخروج بصمت - يعتمد على ما تفعله بالطبع.

تحرير: قد يفعل هذا ما تريد ، إذا كنت بحاجة ببساطة إلى فصل المنطق إلى مكتبة

// Program.cs
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    if(MyLib.Condition1)
    {
        Application.Run(new Form1());
    }
    else if(MyLib.Condition2)
    {
        Application.Run(new Form2());
   }
}


// MyLib.cs
...
public static bool Condition1
{
    get
    {
         return resultOfLogicForCondition1;
    }
}
public static bool Condition2
{
    get
    {
         return resultOfLogicForCondition2;
    }
}

في الأساس ، تحاول إنشاء مصنع مخصص للنموذج لاستخدامه في التطبيق. شيء مثل ما يلي:

في exe:

static void Main()
{
    Application.Run(new Factory.CreateForm());
}

وفي مكتبتك:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top