2016-02-14 63 views
1

现在我有一个连接到我的数据库的小型控制台应用程序。 当调试在Visual Studio中的应用程序,我可以在我的app.config有这样的:如何在释放我的构建时在App.Config中存储连接字符串?

<connectionStrings> 
    <add name="Default" 
     connectionString="Data Source=*******;Initial Catalog=*******;User Id=*******Password=*******;"/> 
</connectionStrings > 

,我可以得到连接字符串是这样的:

string testConnectiongString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString; 

运行的应用程序在Visual Studio中,当这个伟大的工程,如何更改释放并将.exe文件移动到我的笔记本电脑上,或刚刚从Visual Studio中获得:

未将对象引用设置为n一个对象的实例

这是由于连接字符串,我必须硬编码代码中的字符串才能工作。

那么,在释放我的构建时,是否有使用app.config

+3

你部署的app.config除了名为yourapp.exe.config其中yourapp是你的可执行文件您的可执行文件的实际名称。这两个文件必须位于同一个目录中。 –

+0

你把那个App.config放在哪里?你正在运行的应用程序的项目,或者一些DLL?您需要第一个 – StepUp

+0

App.config变成yourAppName.exe.config。 (查看RELEASE/DEBUG文件夹以查找它)这是要与您的应用程序一起分发的文件。你做了这个了吗? – Steve

回答

2

TLDR版本:

所以,反正是有使用的app.config释放我的体型是什么时候?

是,给用户无论是在bin\Release找到建成后的MyApp.exeMyApp.exe.config文件。


你有两个问题:

  1. 当你从Visual Studio中运行,你正在运行的.exe旁边一个.config,但显然,当你只分发您的应用程序,你分发.exe
  2. 如果您分发.config,人们可以阅读它并获取连接字符串的详细信息。

第一一旦你看到它的问题是微不足道的解决。

对于情况下,你应该意识到什么,如果你创建一个新的控制台应用程序,并在调试构建它都和释放,产生的文件夹结构将是这样的:你的app.config文件有

\MyFancyApp\App.config 
\MyFancyApp\MyFancyApp.csproj 
\MyFancyApp\MyFancyApp.sln 
\MyFancyApp\Program.cs 

\MyFancyApp\bin 
\MyFancyApp\bin\Debug 
\MyFancyApp\bin\Debug\MyFancyApp.exe 
\MyFancyApp\bin\Debug\MyFancyApp.exe.config  << ! 

\MyFancyApp\bin\Release 
\MyFancyApp\bin\Release\MyFancyApp.exe.config  << ! 

注已将更名为以匹配可执行文件。您需要它来获取连接字符串。因此,您的应用程序包括这两个这些文件。如果您有NuGet软件包或编译为DLL的辅助类库项目,它还会包含其他DLL。

第二个问题不大解决琐碎。这里有两种可能的解决方案:

  1. Encrypt the .config section。但是,这只会阻止配置文件的读取

  2. 不要将凭据存储在配置中,而是要求用户输入它们。开发时可以使用#IF DEBUG指令跳过那一点。

当然还有其他几个选择,但我认为讨论这些问题可能超出了这个问题的范围,或者一般来说。


PS。如果你正在寻找阻止你得到的实际NullReferenceException,你可以检查null,如:

static void Main(string[] args) 
{ 
    if (ConfigurationManager.ConnectionStrings["Default"] == null) 
    { 
     Console.WriteLine("Missing connection string configuration"); 
     Console.ReadKey(); 
     return; 
    } 

    string testConnectiongString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString; 
    Console.WriteLine("Doing work..."); 
    Console.ReadKey(); 
} 
相关问题