문제

Winform 앱이로드되기 전에 몇 가지를 사전 처리하는 방법을 찾으려고 노력하고 있습니다. 클래스 라이브러리 프로젝트 내의 양식에 정적 무효 메인 ()을 넣고 프로그램 .CS에서 댓글을 달았습니다. 컴파일 타임 오류가 발생했습니다. "... 진입 점에 적합한 정적 '기본'방법이 포함되어 있지 않습니다." 프로그램이로드되지 않으므로 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();
     }
}

다른 팁

Program.cs의 주요 방법을 유지하십시오. 조건에 따라 양식을 인스턴스화하고 메인으로 반환하는 DLL의 메소드를 호출하십시오.

"정적 무효 기본"메소드는 "exe"어셈블리 내에 있어야하지만이 방법이 공유 어셈블리 버전의 "메인"을 호출 할 수 있습니다. 당신은 직접 할 수 없습니다.

Class 라이브러리에서는 정적 void main ()가 의미가 없지만 코드 스 니펫은 프로그램에 배치 된 경우 원하는 것을 정확하게 수행해야합니다.

또한 조건 1과 조건 2가 충족되지 않은 경우에만 '다른'조항이 필요합니까? 필요하지 않을 수도 있지만 대부분의 경우 조용히 종료하는 응용 프로그램보다는 어떤 형태의 피드백을 기대할 것입니다. 당연히하고있는 일에 따라 다릅니다.

편집 : 로직을 라이브러리로 분리하면되면 원하는대로 할 수 있습니다.

// 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