这个问题有点轶事,但对我来说仍然很有趣;我想知道为什么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
任何评论都会非常感激。非常感谢。
答案 0 :(得分:5)
它实际上告诉过你。该代码由设计者生成。设计师需要它离开它的方式。不要改变那些代码,除非你希望设计师用它做些不愉快的事情。
在视觉设计器中看到的与它生成的代码之间存在某种平衡。
现在,假设您对生成的代码进行了一些修改。除非你以与设计师完成相同的方式在完全中进行更改,否则它将无法识别更改。您的更改不会显示在设计图面上。下次进行更改或保存时,设计人员将重新生成代码而无需进行更改。
因此,如果您不想丢失对生成代码的更改,请不要对生成的代码进行任何更改。
答案 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";
// ....
}