我有一个复杂的Winforms应用程序,我必须重构。我在这个应用程序中使用的Singleton-Class存在很大问题。它没有做我认为它应该做的事情(仅在Release-Build中)。
我有一个Program.cs(Proj1.proj),它是主要的切入点。
static class Program
{
private static readonly ILog log = LogManager.GetLogger(typeof(Program));
[STAThread]
static void Main(string[] args)
{
try
{
XmlConfigurator.Configure();
log.Debug("Logging enabled");
File.WriteAllText("test1.txt", "Test");
DBConnection.Instance.GetConnectionString();
log.Debug("GetConnectionString called");
DBConnection.Instance.GetDatabasename();
log.Debug("GetDatabasename called");
Application.Run(new Mainform());
}
catch (Exception ex)
{
//...
}
}
}
这是DBConnection.cs(Proj2.proj)
public class DBConnection
{
private static readonly ILog log = LogManager.GetLogger(typeof(DBConnection));
private static DBConnection instance;
private string connectionString;
private string databaseName;
private DBConnection()
{
log.Debug("DBConnection ctor");
this.connectionString = "example";
this.databaseName = "example2";
}
public static DBConnection Instance
{
get
{
if (instance == null)
{
log.Debug("Instance was null");
File.WriteAllText("test2.txt", "Instance was null");
instance = new DBConnection();
}
log.Debug("Return instance");
return instance;
}
}
public string GetConnectionString()
{
return this.connectionString;
}
public string GetDatabasename()
{
return this.databaseName;
}
}
我在Release Build中的Winform应用程序中观察到以下内容:
在Debug Build中
什么可能导致这种行为?为什么它在Debug中有效但在Release中无效?他为什么两次打电话给构造函数?尽管日志记录正在运行,为什么没有写入一些日志条目。为什么File.WriteAllText不起作用?
我没有想法,我找不到问题的原因。显然,项目中必须有一个设置可能会导致这种情况......因为如果你在新项目中重建上面显示的例子它将会起作用......