Exe - Applikation;DLL - Assembly; Settings; Wie?

17/06/2009 - 20:03 von Oliver Braun | Report spam
Hallo!
Es gibt ja wirklich viele Ansàtze.
Frank ist hier auch ziemlich aktiv.

Ich habe folgendes:
DLL - Assembly, der möchte ich eine Setting Datei mitgeben.
Der Anwender soll hier nichts verstellen, also Eigenschaft
Application.
Exe - Applikation für den Anwender

Jetzt müsste ich ja die Settings haben, die werden aber nicht automatisch
in die
RTest.exe.Config geschrieben.

Was ich will?

Assembly1 - DLL - Konfiguriert sich selber
Assembly2 - DLL - Konfiguriert sich selber
Assembly3 - DLL - Konfiguriert sich selber
Anwendung - Exe - Konfiguriert sich selber RTest.exe.Config

C:\Programme\Meine\Debug\bin\RTest.exe
\_MeineApp\Settings\SettingRegExp.xml
\_MeineApp\Settings\SettingAssembly2.xml
\_MeineApp\Settings\SettingAssembly3.xml
\_MeineApp\Settings\SettingAssemblyXXXXX.xml





System.Configuration.Configuration cfUser =
System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal);
System.Diagnostics.Trace.WriteLine("Benutzer- gespeichert in:" +
cfUser.FilePath);

cfUser.FilePath "C:\\Dokumente und Einstellungen\\User\\Lokale
Einstellungen\\Anwendungsdaten\\Test\\RTest.exe_Url_qfryda5u0z8swqjadgevu42xyf5g0xqs\\1.0.55.3\\user.config" string


System.Configuration.Configuration cfApp =
System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
System.Diagnostics.Trace.WriteLine("Anwendungs- gespeichert in:" +
cfApp.FilePath);

cfApp.FilePath "C:\\Test\\bin\\Debug\\RTest.exe.Config" string


string readFromSettings = Properties.Settings.Default.Supplier;
http://www1.minpic.de/bild_anzeigen...2&ende


Also kann ich ja das Feature nicht nutzen und muss in der Tat es selber
machen, oder?
Wie macht man es richtig?


string pathExe =
System.IO.Path.GetDirectoryName(Application.ExecutablePath);
string dateiPfad = System.IO.Path.Combine(pathExe,
@"\..\..\_MeineApp\Settings\SettingRegExp.xml");
// hier geht das verbinden nicht, sieht jemand einen Fehler?
dateiPfad = pathExe + @"\..\..\_MeineApp\Settings\SettingRegExp.xml";
// so geht es!


Was habe ich gemacht?
Ich habe mich an das Beispiel von Frank angelehnt.
http://dzaebel.net/XmlSerializer.htm


In der Regel reicht hier 1 Objekt, kein Array.

static public SettingsPanelBatchMaskRegExp[]
SettingsPanelBatchMaskRegExp_Read(string dateiPfad)
{
XmlSerializer serializer = new
XmlSerializer(typeof(SettingsPanelBatchMaskRegExp[]));
TextReader tr = new StreamReader(dateiPfad);
SettingsPanelBatchMaskRegExp[] ArraySettingsPanelBatchMaskRegExp =
(SettingsPanelBatchMaskRegExp[])serializer.Deserialize(tr);
tr.Close();
return ArraySettingsPanelBatchMaskRegExp;
}

static public void
SettingsPanelBatchMaskRegExp_Write(SettingsPanelBatchMaskRegExp[]
ArraySettingsPanelBatchMaskRegExp, string dateiPfad)
{
XmlSerializer serializer = new
XmlSerializer(typeof(SettingsPanelBatchMaskRegExp[]));
TextWriter tr = new StreamWriter(dateiPfad);
serializer.Serialize(tr, ArraySettingsPanelBatchMaskRegExp);
tr.Close();
}



SettingsPanelBatchMaskRegExp[] ArraySettingsPanelBatchMaskRegExp = new
SettingsPanelBatchMaskRegExp[1] { new SettingsPanelBatchMaskRegExp() };

ArraySettingsPanelBatchMaskRegExp[0].Charge =
@"^(?<Prefix>H)(?<Content>\w{1,25})";
ArraySettingsPanelBatchMaskRegExp[0].Quantity =
@"^(?<Prefix>Q)(?<Content>\w{1,8})";
ArraySettingsPanelBatchMaskRegExp[0].Supplier =
@"^(?<Prefix>V)(?<Content>\w{1,10})";
ArraySettingsPanelBatchMaskRegExp[0].TypeNoPCB =
@"^(?<Prefix>P)(?<Content>\w{1,13})";
ArraySettingsPanelBatchMaskRegExp[0].LotMask =
@"^(?<Prefix>M)(?<Content>\w{1,25})";

SettingsPanelBatchMaskRegExp_Write(ArraySettingsPanelBatchMaskRegExp,
dateiPfad);
ArraySettingsPanelBatchMaskRegExp = null;

ArraySettingsPanelBatchMaskRegExp =
SettingsPanelBatchMaskRegExp_Read( dateiPfad );

string sCharge = ArraySettingsPanelBatchMaskRegExp[0].Charge;
string sQuantity = ArraySettingsPanelBatchMaskRegExp[0].Quantity;
string sSupplier = ArraySettingsPanelBatchMaskRegExp[0].Supplier;
string sTypeNoPCB = ArraySettingsPanelBatchMaskRegExp[0].TypeNoPCB;
string sLotMask = ArraySettingsPanelBatchMaskRegExp[0].LotMask;


public class SettingsPanelBatchMaskRegExp
{
public SettingsPanelBatchMaskRegExp(){}

private string typeNoPCB;
public string TypeNoPCB
{
get{return typeNoPCB;}
set{typeNoPCB= value;}
}

private string charge;
public string Charge
{
get{return charge;}
set{charge= value;}
}

private string supplier;
public string Supplier
{
get{return supplier;}
set{supplier= value;}
}

private string quantity;
public string Quantity
{
get{return quantity;}
set{quantity= value;}
}

private string lotMask;
public string LotMask
{
get { return lotMask; }
set { lotMask = value; }
}
}

Danke für Tipps und richtige Hinweise
Oliver
 

Lesen sie die antworten

#1 Frank Dzaebel
17/06/2009 - 21:06 | Warnen spam
Hallo Oliver,

Es gibt ja wirklich viele Ansàtze.



Dennoch sind sehr oft die Properties.Settings eine
gute Wahl.



Ich habe folgendes:
DLL - Assembly, der möchte ich eine Setting Datei mitgeben.
Der Anwender soll hier nichts verstellen, also Eigenschaft
Application.
Exe - Applikation für den Anwender
Jetzt müsste ich ja die Settings haben, die werden aber nicht
automatisch in die RTest.exe.Config geschrieben.



ja. Du kannst sie aber zum Beispiel in der
"Settings.Designer.cs" den
internal sealed partial class Settings : [...]
auf public setzen.
Dann kannst Du sie dann zum Beispiel auslesen mit:

propertyGrid1.SelectedObject = Assembly1.
Properties.Settings.Default;


Was ich will?
[...] Anwendung - Exe - Konfiguriert sich selber RTest.exe.Config



Beachte immer, dass im Standardfall die
"RTest.exe.config" wegen Sicherheitseinstellungen **nicht**
vom User beschreibbar ist, der ja aber wohl normal Dein
Programm ausführt! Das geht eben standardmàssig nur in Pfaden,
wie Du sie schon gepostet hast, unterhalb von %userprofile%
zum Beispiel. Was man manchmal macht, ist wàhrend des
Setups gewisse Berechtigungen oder Inhalte zu setzen.


Dein Ziel ist doch, die Settings der DLLs, die unverànderlich
sein sollen, auch im Exe lesen zu können, ja?
Das ginge ja zunàchst mit public. Wir sollten das erstmal
validieren.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen