Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在*类*初始化期间动态设置静态字符串?_C# - Fatal编程技术网

C# 是否可以在*类*初始化期间动态设置静态字符串?

C# 是否可以在*类*初始化期间动态设置静态字符串?,c#,C#,我试图在编译时动态创建连接字符串: private static string m_ConnectionString { get { string connectionString = @"Data Source=" + myLibrary.common.GetExeDir() + @"\Database\db.sdf;"; return connectionString; } } public static string Connect

我试图在编译时动态创建连接字符串:

private static string m_ConnectionString
{
    get 
    {
        string connectionString = @"Data Source=" + myLibrary.common.GetExeDir() + @"\Database\db.sdf;";
        return connectionString;
    }
}
public static string ConnectionString = m_ConnectionString;

我一直遇到类型初始化错误。ConnectionString在运行时结束为null。我试图避免为使用我的代码库的所有应用程序设置连接字符串。对于使用库的每个项目,数据库的位置都不同。我有可以确定更正字符串的代码,但希望在类初始化期间运行它。这可能吗?

代码是在运行时执行的,而不是在编译时执行的。我认为你走错了方向

另一个作为预构建事件运行的程序可以在编译之前修改resources.resx文件的源代码。然后将连接字符串作为资源字符串获取


有点像黑客,但不是我见过的最糟糕的事情。我的版本号以类似的方式递增。

代码是在运行时执行的,而不是编译时。我认为你走错了方向

另一个作为预构建事件运行的程序可以在编译之前修改resources.resx文件的源代码。然后将连接字符串作为资源字符串获取


有点像黑客,但不是我见过的最糟糕的事情。我的版本号也会以类似的方式递增。

只需设置一个断点,然后进入函数并尝试找出问题所在


可能会抛出一些您实际上看不到的异常(在某些底层代码中)。要查找这些情况,您应该在VisualStudio中调试异常并选中列表中的所有框。也许你能找到这样的方法,为什么你得到的是空值而不是字符串。

只需设置一个断点,进入你的函数,试着找出哪里出了问题


可能会抛出一些您实际上看不到的异常(在某些底层代码中)。要查找这些情况,您应该在VisualStudio中调试异常并选中列表中的所有框。也许你可以找到这样的方法,为什么你得到的是null而不是字符串。

我同意Oliver发现错误的方法,但是我想补充一点,你可以把它放在一个静态构造函数中。这将实现“在类初始化期间”的要求


我同意Oliver发现错误的方法,但我想补充一点,您可以将其放在静态构造函数中。这将实现“在类初始化期间”的要求



这是可能的,而且您的代码没有明显的错误。它的使用方式可能有问题。你能在一个小的,独立的测试中重现这个问题吗,你可以发布在这里吗?把明显的问题放在一边,你真的在用其他每个项目重新编译这个库吗(不仅仅是引用库的dll)?不,我不是。也许我应该说“在类初始化期间”。除非:*myLibrary.common.GetExeDir()**中有错误,否则您正在显示的代码应该可以工作:**您可以发布更多关于它的详细信息吗?另外:代码是否编译?如果是:您能发送堆栈跟踪或异常详细信息吗?这是可能的,并且您的代码没有明显的错误。它的使用方式可能有问题。你能在一个小的,独立的测试中重现这个问题吗,你可以发布在这里吗?把明显的问题放在一边,你真的在用其他每个项目重新编译这个库吗(不仅仅是引用库的dll)?不,我不是。也许我应该说“在类初始化期间”。除非:*myLibrary.common.GetExeDir()**中有错误,否则您正在显示的代码应该可以工作:**您可以发布更多关于它的详细信息吗?另外:代码是否编译?如果是:你能发送堆栈跟踪或异常详细信息吗?我想我不是指编译时。我的意思是“在初始化期间”,但在使用项目之前,从我的库中创建任何对象。如果它不属于静态类,我可以使用构造函数。@lonnieah。我觉得奇怪的是,一旦软件部署到其他地方,构建机器上的GetExeDir就与之相关。由于程序集只有在引用其中的类时才会加载,因此除非从客户端代码显式加载程序集,否则不会节省太多时间。在这种情况下,你可以自己调用初始化器代码。我想我不是指编译时。我的意思是“在初始化期间”,但在使用项目之前,从我的库中创建任何对象。如果它不属于静态类,我可以使用构造函数。@lonnieah。我觉得奇怪的是,一旦软件部署到其他地方,构建机器上的GetExeDir就与之相关。由于程序集只有在引用其中的类时才会加载,因此除非从客户端代码显式加载程序集,否则不会节省太多时间。在这种情况下,您可以自己调用初始化器代码。在运行时之前,ConnectionString的值仍然为null。你看,我有另一个自定义对象,它在初始化过程中被构造并设置为静态,而该对象的构造函数尝试使用ConnectionString。显然,在创建这个对象时,ConnectionString仍然为null,我得到了TypeInitializationException。如果连接字符串是一个常量,我不相信会发生这种情况,但是因为它是动态的,所以存在一个问题。我认为我试图做的是不可能的。我继续将另一个对象的创建移动到每个项目的运行时。但是,静态构造函数代码仍然很有用。正如其他人所说,GetExeDir在运行时之前是不可能知道的。我建议您查看一下使用ConnectionString的代码,看看是否可以对其进行重构,以使用与包含ConnectionString的类相同的技术。只要代码调用MyClass.ConnectionString,它就会有一个值(除非有
public static string ConnectionString { get; private set; }

static MyClass()
{
    ConnectionString = @"Data Source=" + myLibrary.common.GetExeDir() + @"\Database\db.sdf;";
}