What happen if I delete App.config in C# application? - c#

I write a small application, that I don't need store anything in config files. So the file App.config in my source is exactly what ever Visual Studio has created.
So I want to delete this file from source code (before compiling). But I noticed that it also contains the .NET version information. I wonder if I delete App.config file, then copy my application to other pc, is it have any strange behavior?

I wonder if I delete App.config file, then copy my application to other pc, is it have any strange behavior?
Nope, it should be fine. There are various (somewhat tortuous) rules about exactly what version of the CLR etc gets used in what situations, but for the most part you're fine to just rely on the default behaviour.
You really don't need an app.config file unless you need to give specific settings.

Related

Using app.config correctly

In several C# projects I have been using an app.config file to pass various settings to my program, settings like connectionstrings, power levels etc.
However sometimes I have come in situations where the settings aren't updated as expected and I have concluded that I am not that well informed with the proper use of app.config file.
Example:
Replacing the .exe file with a new version (where settings are different) to the output directory without changing the exe.config, results in the program seeing the hard-coded settings and not the settings of the existing .exe.config
So my Questions are:
What is the exact role of exe.manifest file
Every time I create a new .exe do I have to paste in the output folder anything else except the .exe file?
Whats the difference in obtaining the setting value by: ConfigurationManager.'settingName'... rather than:
Properties.Settings.Default.'settingName'?
What is the role of app.config build action?
Sorry If I am asking too much in a single Question.
The app.config file is a file that gets a special treatment when running the associated application. If you executable is named MyApp.exe the app.config file should be named MyApp.exe.config. The role of the app.config build task is to copy the file named app.config in your project to MyApp.exe.config in the output directory.
.NET provides ways to read the contents of the file (it is in XML format) and various parts of .NET will look for different sections in this XML to provide configuration.
A widely used section is the settings section you refer to as Properties.Settings.Default. This section plays together with Visual Studio that provides an editor for application settings. The settings are accessed in the code by using a generated class. Adding a setting will add a property to this class and this property is initialized from a value in the app.config file.
In the Visual Studio editor you can set a value for the setting and you can think of this as a default value for the setting. However, if you overwrite the value in the app.config file the later will take precedence. This allows you to modify the app.config file after installation and rerun the application with a modified setting.
You can also access application settings the app.config file using other methods, but in my oppinion using the Visual Studio editor and the code generated class is the best way to do that.
I am not sure I fully understand the problem that you experience. If you update MyApp.exe and leave MyApp.exe.config intact you should not see a change in the settings used by the application (unless of course you have renamed or changed some settings).
The manifest file provides information about side-by-side assemblies and can be used to request elevated privileges among other things. This is not related to the app.config file.
There quite a few resources about that.
See http://msdn.microsoft.com/en-us/library/ms229689%28v=vs.90%29.aspx
and the (better) overview: http://msdn.microsoft.com/en-us/library/k4s6c3a0%28v=vs.110%29.aspx
app.config is a very powerful tool. It addresses many issue like versioning, migration, upgrading etc. but this requires some in-depth reading from the links above.
Maybe one thing you could do, if you want to copy only .exe file every time you build your app, is make a settings.ini or settings.txt file, put your parameters in this file (that are not secret of course) and read all your settings from there when you start your app.
You can put all your connection string logic in your login form if you have one...

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid

I am writing a wpf application (EF, dot net 4, wix 3.6). It compiles fine. I can debug the app and everything works. I can run the produced executable and everything works. I try to package it up with Wix which successfully produces an .msi file, which copies the executable to the right place. When I run the msi-deployed .exe I get the error above.
I've checked out the questions here: The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid, and here: The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid. The second link isn't the solution as that deals with web.config and I'm in a windows desktop environment.
The first solution talks about multiple projects and the EF project's config needing duplication in the other projects. In my case the only two projects are the Main Application (which includes the EF stuff) and the Wix installer project.
In any event, I copied the App.config to the Wix project, but that didn't make any difference. I had a lot of trouble getting the wix stuff going, but I think it's right now, however that might be a pointer to the solution.
Can anyone help?
OK, as Gert Arnold correctly pointed out, the config file had not been copied to the application directory, so the connection strings couldn't be found. The config file created is named MyAppName.exe.config, and contains stuff from the App.config file created in VS and other bits (like EF config details).
(Something must be different between the settings for the VS2010 installer and the Wix installer as the .msi deployment has never involved a .config file before.)
In any event, adding the .exe.config file to the Product.wxs file as a component contained within the main application feature solved the problem.
Newb notes:
If you copy and paste the component tag, remember to set KeyPath="no".
The path to
the files being deployed is relative to the location of the .wxs file

deploy exe to server

I created a console app that I want to use in a scheduled package in SSIS. In the app, I'm connecting to the database to get email addresses and sending emails to that list. When I put the .exe on the server it won't work, but when I put the whole folder over, it works fine. I'm assuming it needs the app.config.
What's the best way to deploy the exe to the server? Should I publish the console app first, or just build it and take the exe and the app.config (not sure if that's possible)?
If your .exe needs the app.config either copy the app.config over as well, or alter the program so that whatever relies on the app.config...doesn't...so you don't need to copy the app.config. The second may or may not be a viable option, since we don't know what in your program uses the app.config.
Seems like a fairly simple choice to me. What else were you expecting to hear?
Copying whole Bin folder is perfectly valid way of deploying files (sometimes called x-copy deployment).
There could be other files in Bin folder (i.e. referenced assemblies that you marked as "copy" in the project).
You can build more formal install package, but it most likely overkill for simple scenarios.

.Net app.config file ignored when under c:\ProgramFiles\

I have a strange phenomen
I have .Net 4.0 app.
When the myapp.exe.config is under the normal programfiles folder it is ignored. Even if I delete it or write nonsense in it the myapp.exe works and it seems to me that values are taken from a previous installation.
When I copy the folder to e.g. to Desktop it works correct.
Edit: when I copy form c:programfiles\myapp\ to c:\programfiles\copy of myapp\ it works
It seems to be only a problem in the progamfile folder where a previous installation has benn made. (I guess)
Any ideas?
Best regards
Could you share your operating system with us? I have had similar problems in the past with an application (Win 2008). One simple work arround if you are not the system administrator, is to edit the .config file on another location, and then place it back.
Sometimes the content of a file is not really editted, however a copy is created with your changed on the back, which is confusing.
Most probably you are dealing with a case of "compatibility files" - in your Program Files folder you have a file saved in the Compatibility files view that is being read instead of your actual file.
Delete the compatibility files and everything should work correctly.
In this article, in the "how about the ugly part?" you will find described exactly your scenario.
Best regards
There is a folder
C:\Users\myuser\AppData\Local\VirtualStore\Program Files\myapp
Where there was the config which was taken.
This "feature" comes that my app runs not as admin.
Read the comments to UAC.
This happens only to Win7 and Vista. Not on XP.
regards

C# Settings xml file location

I have a project that reads in a file based on a value in a C# Setting class. This value however changes from machine to machine and Id rather not ask the user the first time the program is run as its a corporate environment, instead Id like it to be set in the installer, but where is the file located? Is there an easier method?
This is a visual studio addin not a standalone program
From your post it appears you have a windows application? , you can store an initial value in the application config, you can make an installer in Visual Studio and write custom actions that can write values to the file on first install in you install project.
The configure file is the easiest way to do what you are asking, however it is NOT the best. In fact it is recommended Not to use .config files for such cases.
whenever users install an 'update', there is a risk of overwriting their existing changes.
some businesses might have policy restrictions on the .config files.
the user cannot easily move his settings from one PC to another.
From my own experience, using XML, MS-Access, Registry or text files to store user settings has proven more useful than using the .config files.
I believe you are talking about designer-generated settings (the .settings file)?
The exact path usually contains some sort of a Hash (check this link). I usually have my own settings class which I serialize to and from xml using XmlSerializer, which gives me more freedom (I think C# settings files don't allow you to add custom enums, for example, or they make it a bit harder to do it than simply adding them to the .settings file).
However, maybe there is no need to set values during installation? For example, you could add a FirstStartup setting (set to true initially), which you can read when your App is started for the first time, and then set it to false. That way you can set your default settings when you detect a "first startup".
You will certainly need some sort of custom action at the end of your installer. You haven't mentioned what technology you're using to deploy your application so I will refrain from giving any specific guidance.
I recommend setting the value in your App.config. This is an xml file which will be named MyApplication.exe.config in the same directory as your application. Add it to your installer if it is not there already. In your installer, add a new setting:
<configuration>
<appSettings>
<add key="MySetting" value="My Value"/>
</appSettings>
</configuration>
In your code, retrieve the setting:
String setting = ConfigurationSettings.AppSettings["MySetting"];
If this is a machine-wide setting, this installer is the right place to set this. If you do it on the first execution you will run into a host of problems with permissions on the files and directories if the first person to run the app is a user with limited permissions.
Registry or an INI file or a XML file whatever suits you best.
Best option would be registry. Istalling the application will require Admin access so writing to the registry during installation will not be an issue.
More over if some one accidently deletes the ini or settings file then the program might stop working.
You said that this is for a corporate environment. You can create an administrative template for group policy to set the default in the registry. Then, your program can just query that one registry value if the default hasn't already been set.
I personally would never use web.config or app.config. Just read your own xml file, have a look at my post on this:
http://www.picnet.com.au/blogs/Guido/post/2009/09/10/XML-Settings-Files-No-more-webconfig.aspx
Thanks
Guido
To answer the "Where is the file located" bit of the original question for those interested (I'm assuming that the "settings file" in question is the "Settings File" item available from the "Add New Item" dialogue).
In Win7 (and probably all the other ones) the settings file will generate under the path:
C:\Users\[user]\AppData\Local
The folder structure from here on out depends on your AssemblyInfo and build information, the "AssemblyCompany" field (if populated) is used for the top-most folder, beneath this is a folder copying the application executable name, followed by the build and then finally the settings file (named "*.config").
In my case, the complete path is as follows:
C:\Users\[user]\AppData\Local\[company_name]\Application.exe_StrongName_zx0v1qxyoass4d0z3mtwe3vbrhaehkjg\0.0.5812.21662\user.config
My case is different, my project is a class library (dll) which have the app.config file. I decided to create 4 application settings variables (title, url, limit, rate). To create this, i right-click ont he project --> Properties --> Settings. this values you can retrieve in code using this command --> Settings.Default.title, ...etc
the problem is let say i instantiate 5 objects (same object for example MyProject.MyClass) from this library, i want the instance be able to have its own settings. i mean each of the instance may have their xml setting file. can this be done?

Categories

Resources