2009-07-26 3 views
3

이 질문은 일종의 일화이지만 여전히 흥미 롭습니다. 이 디자인 타임에 다음과 같은 경고을 보여주는 것으로Visual Studio 2008 디자이너 생성 코드의 변경 내용에 대한 경고

public class Service101 : ServiceBase 
{ 
    /// <remarks> 
    /// Shown at Start -> Settings -> Control Panel -> Administrative Tools -> Services 
    /// </remarks> 
    internal const string SERVICE_NAME = "WinSvc101"; 
    /// <remarks> 
    /// Shown at Start -> Settings -> Control Panel -> Administrative Tools -> Services 
    /// </remarks> 
    internal const string DISPLAY_NAME = "Windows Service 101"; 
    /// <summary> 
    /// Public constructor for Service101. 
    /// </summary>  
    public Service101() 
    { 
     InitializeComponent(); 
    } 

    private void InitializeComponent() 
    { 
     this.ServiceName = Service101.SERVICE_NAME; 
     this.EventLog.Source = Service101.DISPLAY_NAME; 
     this.EventLog.Log = "Application"; 

     if (!EventLog.SourceExists(Service101.DISPLAY_NAME)) 
     { 
      EventLog.CreateEventSource(Service101.DISPLAY_NAME, "Application"); 
     } 
    } 
    #region Events 
    /// <summary> 
    /// Dispose of objects that need it here. 
    /// </summary> 
    /// <param name="disposing">Whether or not disposing is going on.</param> 
    protected override void Dispose(bool disposing) 
    { 
     // TODO: Add cleanup code here (if required) 
     base.Dispose(disposing); 
    } 

:

Warning 1 The designer cannot process the code at line 68: 

if (!EventLog.SourceExists(DISPLAY_NAME)) 
{ 
    EventLog.CreateEventSource(DISPLAY_NAME, "Application"); 
} 

The code within the method 'InitializeComponent' is generated by the designer and should not be manually modified. Please remove any changes and try opening the designer again. E:\Proyectos\beanstalk\dotnetfx\trunk\WinSvc101\WinSvc101\Service101.cs 69 0 

모든 의견은 매우 감사하겠습니다 내가 왜 비주얼 스튜디오 2008 상수 다음 사용을 사랑하지 않습니다 궁금 해서요 . 많이 미리 감사드립니다.

답변

3

InitializeComponent()에 코드를 추가 할 때 디자이너가 만족스럽지 않습니다. 다음과 같이 시도해보세요.

public Service101() 
{ 
    InitializeComponent(); 
    this.createEventSource(); 
} 

private void InitializeComponent() 
{ 
    this.ServiceName = SERVICE_NAME; 
    this.EventLog.Source = DISPLAY_NAME; 
    this.EventLog.Log = "Application"; 
} 

void createEventSource() 
{ 
    if (!EventLog.SourceExists(DISPLAY_NAME)) 
    { 
     EventLog.CreateEventSource(DISPLAY_NAME, "Application"); 
    } 
} 
+0

Andrew, 댓글에 대해 많은 감사를드립니다! 변경 사항이 적용되면 메시지는 다음으로 변경됩니다. 경고 \t 1 변수 'SERVICE_NAME'이 (가) 신고되지 않았거나 할당되지 않았습니다. 경고 \t 2 변수 'DISPLAY_NAME'이 (가) 신고되지 않았거나 할당되지 않았습니다. –

+0

경고를 해결하기 위해 Service101.SERVICE_NAME과 Service101.DISPLAY_NAME을 각각 사용해야했습니다. –

5

실제로 말했어. 이 코드는 디자이너가 생성합니다. 디자이너는 그것을 남겨 두는 방식이 필요합니다. 디자이너가 불쾌한 일을하기를 원하지 않는다면 그 코드를 변경하지 마십시오.


비주얼 디자이너에서 보는 것과 생성 된 코드 사이에는 일종의 평형이 있습니다.

  1. 당신은 빈 디자인 화면으로 시작, 그래서
  2. 당신은 디자인 화면에 뭔가를 끌어에는 생성 된 코드가 없습니다. 디자이너는 코드를 생성하는 데 필요한 코드를 생성합니다.
  3. 해당 개체의 속성을 설정하면 디자이너가 지정한대로 속성을 설정하는 코드를 생성합니다.
  4. 저장 후 닫음
  5. 디자이너에서 문서를 다시여십시오. 설계자는 디자인 화면에 무엇을 표시할지 파악해야합니다. 생성 된 코드를 읽고 코드가 자체적으로 생성되었음을 알고 있기 때문에 코드가 디자인 표면에서 의미하는 바를 알고 있습니다.
  6. 다음에 변경 사항이나 저장 내용이 있으면 코드가 재생성됩니다.

이제 생성 된 코드를 수정한다고 가정 해 보겠습니다. 에서 정확히으로 변경하지 않는 한 디자이너가 변경 한 것처럼 변경을 인식하지 못합니다. 변경 사항은 디자인 화면에 표시되지 않습니다. 다음에 변경 또는 저장이있을 때 디자이너는 변경하지 않고 코드를 다시 생성합니다..

따라서 생성 된 코드의 변경 내용을 잃지 않으려면 생성 된 코드를 변경하지 마십시오.

+0

John 님, 정교한 의견을 보내 주셔서 감사합니다. –

+0

그게 전부지만 괜찮아요 아무것도 해결하는 데 도움이되지 않습니다. 근본 원인 질문은 실제로 디자이너가 실제로 실행하고 보는 것입니다. 방금 구성 파일에서 몇 가지 UI 필드를로드하고 채우는 오래된 코드를 열었습니다. "디자이너"는 양식의 비공개 할당을 보거나 실행하지 않는 것처럼 보입니다. – ZXX

+0

@ZXX : 요점은 디자이너가 코드를 작성한 것이고 디자이너는 코드를 사용하여 원하는 것을 수행합니다. 디자이너가 아니라면 디자이너는 코드에 손을 대지 마십시오. –

3

나에게 분명히 들립니다. 자동 생성 된 코드를 수정했으며 그렇게해서는 안됩니다.

최악의 경우 변경 사항이 손실 될 수 있습니다. 가장 좋은 방법은 예기치 않은 코드를 발견하고 변경하지 않으므로 변경 사항을 잃지 않도록하는 것입니다. 그러나 또한 코드를 이해할 수 없습니다. 상수를 다른 위치에 배치해야합니다.

+0

당신의 기여에 감사드립니다. Jaime! –

1

요점은 약간이지만 어쨌든 왜 상수 (및 공용)를 사용하는지 알지 못합니다. 너 그냥 할 수 없어?

private void InitializeComponent() 
{ 
    this.ServiceName = "WinSvc101"; 
    this.EventLog.Source = "Windows Service 101"; 
    // .... 
} 
+0

안녕하세요 대단히 감사합니다. 질문에 대답하기 위해 serviceInstaller.ServiceName 속성이 항상 Service101.ServiceName과 일치하는 조건을 보장하기 때문에 상수를 사용하고 있습니다. 당신이 그것을 달성하는 더 좋은 방법을 안다면 코멘트를 주저하지 마십시오! –

+0

다른 클래스에서도 사용할 필요가 있기 때문에 공개되어 있습니다. –

+0

public 대신 internal을 사용할 수 있습니다. 즉, 클래스 내에서 액세스 할 수 있지만 외부에서는 액세스 할 수 없습니다. 서비스를 작성한 후에는 보통 특수 app.config 파일에 구성 값을 저장 한 다음 서비스가 시작될 때 정적 내부 속성으로 읽습니다. 이러한 속성은 클래스에서 액세스 할 수 있지만 공개적으로 노출되지는 않습니다. 물론, 그보다 더 좋은 방법이있을 수 있습니다 - 나는 전문가가 아닙니다! 행운을 빕니다. app.config 참조 : http://geekswithblogs.net/akraus1/ articles/64871.aspx –