Visual Studio 2008警告关于Designer生成的代码的更改

时间:2009-07-26 13:05:27

标签: c# visual-studio-2008 designer visual-studio-designer

这个问题有点轶事,但对我来说仍然很有趣;我想知道为什么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   

任何评论都会非常感激。非常感谢。

4 个答案:

答案 0 :(得分:5)

它实际上告诉过你。该代码由设计者生成。设计师需要它离开它的方式。不要改变那些代码,除非你希望设计师用它做些不愉快的事情。


在视觉设计器中看到的与它生成的代码之间存在某种平衡。

  1. 您从一个空的设计图面开始,因此没有生成的代码
  2. 您将某些东西拖到设计图面上。设计者生成创建它所需的代码。
  3. 您可以设置该对象的属性,并且设计器会生成用于设置您指定的属性的代码。
  4. 您保存并关闭
  5. 您在设计器中重新打开文档。设计师必须弄清楚要在设计表面上显示的内容。它读取它生成的代码,并且因为它知道代码是由它自己生成的,所以它知道代码在设计表面方面意味着什么。
  6. 下次更改或保存时,会重新生成代码。
  7. 现在,假设您对生成的代码进行了一些修改。除非你以与设计师完成相同的方式在完全中进行更改,否则它将无法识别更改。您的更改不会显示在设计图面上。下次进行更改或保存时,设计人员将重新生成代码而无需进行更改

    因此,如果您不想丢失对生成代码的更改,请不要对生成的代码进行任何更改。

答案 1 :(得分: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");
    }
}

答案 2 :(得分:3)

我觉得很清楚。它告诉你,你已经修改了自动生成的代码,你不应该这样做。

在最糟糕的情况下,您可能会丢失更改。在最好的情况下,它会发现一些意外的代码,并且它不会改变任何内容,因此您不会丢失更改。但它也无法理解你的代码。您应该将常量放在任何其他位置。

答案 3 :(得分:1)

稍微偏离了这一点,但我真的不明白你为什么要使用常量(以及公共的那些),无论如何。你不能这样做吗?

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