Laden...

Forenbeiträge von Seikilos Ingesamt 753 Beiträge

17.08.2010 - 08:20 Uhr

Mir ist aufgefallen, dass ich bei einem Projekt keine Unit Tests nutzen kann, weil diese auf Internals von einer Assembly zugreifen müssen:


[assembly: InternalsVisibleTo("Tester")]

->

error CS1726: Friend assembly reference 'Tester' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations.

Ok. Verwirrung ist bei mir groß. Das heißt doch, die Anwendung ist strong named. Oder?
Ich hab die betroffene Executable ohne das Internals gebaut und mal mit sn.exe gecheckt:

 $ sn.exe -T app.exe
app.exe does not represent a strongly named assembly

Öh? Was? In den Settings ist bei der Anwendung das Sign Assembly auch deaktiviert.

Wie kommt .net auf die idee, dass es strong-named ist?

Dann hab ich die AssemblyInfo.cs genauer angeguckt, ganz unten steht noch ein Block:


[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]

Aber was bedeutet das? Heißt das, dass kein Strong-name erzeugt wird, oder ist das ein Artefakt von .net 2.0 und bewirkt, dass ich keinen Key haben, aber dennoch strong-named bin???

App.exe (nicht von mir) wird mit VS 2008 und Framework 2.0 kompiliert, mein Tester mit 3.5.

16.08.2010 - 16:28 Uhr

Ich denke das Problem bei mir ist, dass die Form die Plugins im new von sich selbst lädt. Sprich das Plugin ist da bevor die Form bereit ist. Hmmmf.

Danke für die Hilfe

16.08.2010 - 15:31 Uhr

Process.GetCurrentProcess ().MainWindowHandle liefert mir null.

Das habe ich bereits probiert. Aber wenn ihr das auch vorschlagt, dann sollte es wohl nicht null, oder?

Das Singleton von Myth erfordert die Anpassung des Host codes, was hier ja nicht möglich ist.

Danke

16.08.2010 - 14:01 Uhr

Es gibt eine Anwendung A, welche eine Form instantiiert und desweiteren ein Plugin, dynamisch zur Laufzeit lädt, welches ein Interface implementiert.

Ich befinde mich im Scope des Plugins und kenne erstmal nicht die Elternanwendung und habe keine Referenzen darauf bei der Erzeugung des Plugins.
Also sprich kein new MeinPlugin(this);
Das Plugin kennt also seinen Kontext nicht.

Mein Problem an dieser Stelle: Ich benötige diesen Kontext.
Gibt es einen Weg aus dem Plugin (DLL) die Form der Anwendung A zu bekommen?

Vom Konzept her ist es unsauber, dessen bin ich mir bewusst. Ich versuche nur zu prüfen, ob ich über Reflection an die aktuelle Instanz rankomme oder nicht.
Die Typinformation von der Form da oben habe ich bereits durch das Einbinden der Anwendung A Assembly, ich finde nur keinen Weg, mir die Instanz zu holen.

Ich krieg über Reflection den Stack und die Methode, aber nicht die Instanz selbst, hmmm

05.08.2010 - 14:07 Uhr

Mein Weg:
Gui und eine Picturebox auf die Canvas ziehen. SizeMode auf StretchImage stellen


Image i =  new Bitmap(@"test.png");
pictureBox1.Image = i;
i.Save(@"D:\snapshots\results\foo.png");

Das Ziel ist quasi das Bild direkt wieder als png abzuspeichern. Das Bild in picturebox sieht vollkommen korrekt aus, aber das gleiche Image abgespeichert nochmal als PNG zerschießt mir die Darstellung.

Hat .net 3.5 Probleme mit der Verarbeitung von 48 bits per Pixel PNG Daten?
Wenn ich selber eine PNG mit Photoshop erstelle, dann kann die Problemlos gelesen werden.
Beispiel Datei, Achtung über 1 mb groß

05.08.2010 - 10:28 Uhr

Ergänzung.
Ich habe in den Datenstrukturen des sender objects Ausschau nach ContextMenu gehalten und keins gefunden.
Der sender ist ein MenuItem, der Owner davon aber ein ToolStripMenu und kein ContextMenu (obwohl das MenuItem in ein ContextMenu gepackt worden ist).
Der cast von ToolStrip zu ContextMenu hat nicht funktioniert und das ToolStrip Menu hat kein SourceControl. Ferner konnte ich im Parent auch kein ContextMenu ausmachen

05.08.2010 - 08:52 Uhr

Welcher aber nicht im sender des Click Events vom MenuItem drin ist, oder?
Ich find den nur, wenn ich contextmenu Opening Event abfange

05.08.2010 - 08:43 Uhr

Ich hab ein ContextMenuStrip mit Items. Das Menü ist bei drei verschiedenen Panels als "ContextMenuStrip" eingetragen.

Die Items werden dann zwar bei Rechtsklick angesprungen und ich kann auch an das Parent des Items, sprich an das ContextMenuStrip drankommen, aber ich finde das Panel nicht, von dem das Menü geöffnet worden ist.
Gibt es diese Information?

04.08.2010 - 12:20 Uhr

Ah danke

04.08.2010 - 07:38 Uhr

Diese Option ist mir und der Doku unbekannt

03.08.2010 - 16:52 Uhr

Ich hab ein UserControl, das ein paar projektspezifische Parameter hat, darunter auch ein Image.
Diese Komponente wird mehrfach instantiiert und in einem MDI Kontext (mit Docking) benutzt. Wenn ich dieses Fenster mit meinen UserControls nun anders skaliere, also erst kleiner und dann primär größer mache, so müsste der Redraw das UserControl neu zeichnen. Dies passiert aber nicht, es wirkt so, als würde das Paint Event nicht aufgerufen werden, sprich mein Control wird visuell zerschossen. Beim verkleinern verschwindet ein Teil des Controls und beim Vergrößern wird der Bereich nicht neu gezeichnet.

03.08.2010 - 15:00 Uhr

Ich hab ein Usercontroll bei dem ich das OnPaint überladen habe.

Wenn ich dieses Objekt in der anwendung platziere, so wird es korrekt gezeichnet. Bedecke ich es nun aber teilweise, so wird die Komponente nicht neu gezeichnet.
Wenn ich einen Break Point habe und die gleiche Aktion ausführe, so wird der Breakpoint ausgelöst und das User Control wird dann korrekt dargestellt.

Das Usercontrol und die Elternanwendung haben bereits folgende Attribute:

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);

Desweiteren hab ich ebenfalls OnPaintBackground überladen.
Vergesse ich einen Call?

03.08.2010 - 10:54 Uhr

Ich spiel grad mit den neuen Features rum (mir ist bewusst, wie alt LINQ ist)

Ich hab ein Query, was so aussieht:

 var fis = from diffFile in Directory.GetFiles(diffPath)
                   where File.Exists(oldPath + "\\" + new FileInfo(diffFile).Name) 
                   select diffFile;

Der loopt ne liste und guck ob die Dateinamen in oldPath und in diffPath gleich sind.

Nun krieg ich die Menge, bei dem das Where true ist, aber gibt es einen weg, auch ein else zu implementieren? Oder greift man da wieder zu der For schleife?
Ich will quasi wenn File.Exist false is ein event erzeugen und das select dann natürlich nicht mehr ausführen. Ist dies möglich?

21.05.2010 - 18:31 Uhr

Kann ich denn einen String oder ein Array oder so als Data Source eines grid views übergeben? Denn ich will es automatisch halten. Lesen, Parsen, Editieren und speichern kann ich alles, aber ich will es nicht manuell machen

21.05.2010 - 14:37 Uhr

Ich will es nicht in eine DB laden, ich will ein Programm zur Bearbeitung einer CSV "Datenbank" die eine Endung tbl hat. Odbc / ich hat Probleme damit, eine tbl einzulesen, csv geht, txt geht, tbl geht nicht (obwohl der Extension string tbl umfasst)

21.05.2010 - 09:44 Uhr

Entschuldige, das mit reflections werd ich noch testen.

21.05.2010 - 09:05 Uhr

Als Parameter kannst du als Typ params object[] nehmen.

Das ist mir bewusst, aber die aufzurufende Methoden sind explizit definiert, wie soll eine Methode mit der Signatur params object[] eine betreffende Methode mal mit int, string, mal nur mit string, mal mit string, string füllen?

20.05.2010 - 14:14 Uhr

Mein Connection string war in der Tat falsch, das Problem ist, die Endung der Datei muss explizit .tbl sein,

Ich hab es hiermit versucht:

string connectionString = String.Format("Extensions=txt,csv,tab,asc,tbl;Driver={{Microsoft Text Driver (*.txt; *.csv)}};Dbq={0};", fileInfo.DirectoryName);
            

Also Extensions mit tbl erweitert, dann krieg ich Error 42000. Datei ist schreibgeschützt, aber das ist die gleiche Datei wie vorher, nur umbenannt von datei.csv zu datei.tbl.
Bin Admin und hab volle Rechte aufs Verzeichnis, scheint so, als würde das Teil tbl einfach nicht anerkennen

20.05.2010 - 12:40 Uhr

verwendetes Datenbanksystem: CVS mittels ODBC

Ich hab recht wenig erfahrungen mit ODBC und C# (.net 1.1) und komme da nicht weiter. Folgenden Code hab ich mir zusammengesucht:

Datei liegt in D:\datei.tbl

            string path = @"D:";
            string file = "datei.csv";
            string constr = @"Driver={Microsoft Text Driver (*.txt; *.csv, *.tbl)};Dbq="+path+";Extensions=csv,txt,tbl";
            OdbcConnection con = new OdbcConnection(constr);
            
            OdbcCommand cmd = new OdbcCommand("select * from "+file, odbcConnection);
            cmd.CommandType = CommandType.Text;

            OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
            adapter.SelectCommand = cmd;
            odbcConnection.Open();
            DataTable dt = new DataTable();
            adapter.Fill(dt);

            dataGrid1.DataSource = dt;

Bei dem Fill krieg ich ne Exception und den Error 42S02, datei.csv konnte nicht gefunden werden.

Tja, nun bin ich ein wenig ratlos.

Edit: Datei in [ ] zu setzen hat es auch nicht gelöst

20.05.2010 - 10:19 Uhr

Es gibt ja unter umständen eine variable Anzahl an Parametern UND deren weren, die ich durchreichen müsste. Ich bin nicht sicher, wie das klappen soll.

Wie kann eine template Methode denn wissen, wieviele Parameter die an den delegaten übergeben soll?
Ich muss theoretisch ja die Try catch geschichte auslagern:


void genericMethod<...>(  X  )
 {
        try
        {
            setOutputStatus(tbox, Result.RUNNING);
            this.Refresh();
            Magic tpd = new Magic();

            if( X )
            {
                setOutputStatus(tbox, Result.FINISHED);
            }
            else
            {
                setOutputStatus(tbox, Result.FAILED);
            }
            return;
        }
        catch(Exception e)
        {
            MessageBox.Show(this, "Exception occured: "+e.Message,"Exception occured during progress",MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }

Da happerts bei mir. Ich muss die Methode ja nicht mit mit string, unsigned oder void instantiieren sondern eigentlich schon mit dem Aufruf der Methode, weil die generische Methode ja nicht weiß, ob sie func(x, wert1), oder func(x, wert2), oder func(x, wert1,wert2) aufrufen muss. Das wissen ja nur aufrufenden Methoden, nur das der Methoden aufruf halt "verzögert" werden muss, bis er in dem try catch drin ist und ne Instanz von Magic erzeugt worden

20.05.2010 - 09:39 Uhr

Ich arbeite mit .net 1.1 und VS 2003, daher keine coolen Sprachfeatures hier 😕

Anbei habe ich mal zwei Beispielmethoden, die bereits relativ generisch sind:



protected void GenericComboBoxMethodHandler(ComboBox cbox, TextBox tbox , FuncDelegateUint funct)
{
	int i = cbox.SelectedIndex;

	if( i > -1)
	{
		try
		{
			setOutputStatus(tbox, Result.RUNNING);
			this.Refresh();
			Magic tpd = new Magic();
		
			if( funct( tpd, (uint)i) )
			{
				setOutputStatus(tbox, Result.FINISHED);
			}
			else
			{
				setOutputStatus(tbox, Result.FAILED);
			}
			return;
		}
		catch(Exception e)
		{
			MessageBox.Show(this, "Exception occured: "+e.Message,"Exception occured during progress",MessageBoxButtons.OK, MessageBoxIcon.Stop);
		}

	}
  
	// Fallback if exception or index out of range
	setOutputStatus(tbox, Result.NOT_SELECTED);

}

protected void GenericVoidMethodHandler(TextBox tbox ,FuncDelegateVoid funct)
{
	try
	{
		setOutputStatus(tbox, Result.RUNNING);
		this.Refresh();
		Magic tpd = new Magic();
		
		if( funct( tpd) )
		{
			setOutputStatus(tbox, Result.FINISHED);
		}
		else
		{
			setOutputStatus(tbox, Result.FAILED);
		}
		return;
	}
	catch(Exception e)
	{
		MessageBox.Show(this, "Exception occured: "+e.Message,"Exception occured during progress",MessageBoxButtons.OK, MessageBoxIcon.Stop);
	}

}

Alles im try-catch block ist nahezu gleich, bis auf den delegaten aufruf, bei dem einen hat er parameter und bei dem anderen nicht.
Dennoch gefällt mir die Redundanz hier nicht, aber mir fällt kein Weg ein, wie ich den delagaten so generalisieren kann, dass ich beliebige Methoden aufrufen kann.

Ich versuche also im Moment func(x, uint) und func(x) gleich zu behandeln, es kann sein, dass dann noch func(x, uint, string) dazu kommt usw

05.04.2010 - 18:09 Uhr
 List<string> output = new List<string>();
            List<string> outputExpected = new List<string>();
            target.ExtractCases(ref text, ref output);
          
            Assert.AreEqual(output.SequenceEqual(outputExpected),true);

LINQ Extension erlaubt SequenceEqual

05.04.2010 - 11:07 Uhr

Hat VS 2008 eine Möglichkeit, zwei wertgleiche Listen miteinander zu vergleichen?
AreEqual prüft nur die Adresse, nehme ich mal an.
Aber gibt es da einen Container check der das auf Element Basis durchführt? Oder muss ich mir selber ne Schleife dafür schreiben?

27.03.2010 - 12:21 Uhr

Ich versuche in VS 2008 eine Toolbar für die IDE zu erzeugen, was gut klappt. Nun hab ich folgende Definition von der Toolbar:


<Menus>
      <Menu guid="guidBoostTestToolbarCmdSet" id="Toolbar" type="Toolbar" >
        <CommandFlag>DefaultDocked</CommandFlag>
        <CommandFlag>IconAndText</CommandFlag>
        <Strings>
          <MenuText>Boost Tester</MenuText>
          <ButtonText>Boost Tester</ButtonText>
          <CommandName>Boost Tester</CommandName>
        </Strings>
      </Menu>

Preisfrage: Das Ding hat Text und Menü aktiviert, wie setz ich nun aber den Text und wie setze ich ein Icon? Icons können ja nur Buttons haben, aber wenn das Menü so eine Option hat, sollte ich doch irgendwie auch ein Icon setzen können, oder?

05.01.2010 - 13:58 Uhr

Ich würde gerne ein Programm in C# schreiben, welches einen Http Listener auf eine bestimmte Domain legt.
Hintergrund:
Ich teste lokal eine Anwendung mit functional test und in einem Test wird eine Anfrage an einen Server im Web gestellt. Ich möchte für die Tests jedoch verhindern, dass dieser nach außen gelangt und den lokal bearbeiten und einen eigenen Response dafür schicken.
Die Artikel, die ich bis jetzt gefunden habe, zielen alle auf ASP.net ab und haben mir leider nicht geholfen. (Da waren Einträge für Web.config usw, die sind doch nur für ASP Anwendungen, oder?)
Es ist kein lokaler IIS oder ähnliches vorhanden, ich muss ausgehende Anfragen abfangen.

23.06.2009 - 06:59 Uhr

Danke für die Infos.
Das Snippet von zommi scheint ziemlich brauchbar zu sein 😃

Winapi ist einfach nicht mein Freunde, aber um das komm ich wohl auch nicht in C++ rum...

22.06.2009 - 21:39 Uhr

Hallo,

hat C# oder eher .net die Möglichkeit, auf Fat32 Daten direkt zu zugreifen und diese Auslesen und manipulieren?
Mich interessiert, ob es möglich ist, mit C# die Verzeichnistabelle auf Dateisystem ebene zu modifizieren .

20.02.2009 - 07:26 Uhr

Wollte gestern die Antwort selber posten, aber da hatte das Forum Probleme.

19.02.2009 - 15:53 Uhr

Weißt du, ob man die Klammern Parre () nummerieren kann? Ich muss ein Pattern ändern und vorne ein Klammernpaar einfügen, nur verschiebt sich dadurch der index aller späteren klammern, was extrem nervig ist

19.02.2009 - 10:39 Uhr

Oha, wie unübersichtlich, aber es geht! Danke 😃

19.02.2009 - 10:22 Uhr

Das ist schlechter C++ code, viel davon und ich muss alle getter und setter generieren, nur nicht für friend class 😄
Im Grunde ist das ja wurscht, ist ja nur ne Zeichenketten-Operation

19.02.2009 - 10:01 Uhr

Klar kenne ich den RegExpr Tester, hab ich natürlich auch.

Meinst du mit dem Lookahead:


@"(\s+)(?!friend class)([\w:_]+)\s+([\w]+);"

Wenn ja: hat nicht geklappt.

PS: Kennst du schon das Online Reg Expr Test Tool? 😄

Lookbehind konsumiert doch nur das Element nicht, oder?

19.02.2009 - 09:21 Uhr

Versuche ein RegExpr, welches mir in solchem Code:

	struct W_RX_: RX_
	{
		W_RX_() : RX_() {};
		friend class RAW;
		std::string dbUniqueId;
		W_RX_Header header;

	};
	typedef struct W_RX_W_RX_;

Ziel ist das Filtern aller variablen deklarationen, dieser Pattern klappt:


@"(\s+)[^friend class]([\w:_]+)\s+([\w]+);"

Aber ich bekomme durch [^friend class] probleme mit W_RX_, es ist in der Tat so, dass alles korrekt gematched wird, jedoch in der jeweiligen Gruppe anstatt W_RX_ nur RX drin ist!

Gibt es da einen anderen weg? Oder wo ist der fehler?

03.12.2008 - 12:44 Uhr

wie ich das reche ist mir vollkommen klar, aber wie will man diese Formeln bitte schön in einem Programm eingeben?
Also wie sieht das Programm aus, was dies kann

03.12.2008 - 11:44 Uhr

Mir will partout nicht klar werden, wie man Programmiertechnisch den Schnittpunkt zweier Vektoren berechnet.
Von der Mathematischen Seite ist es ja kein Problem.
Man nehme dieses Beispiel (siehe anhang)

Die Zerlegung in drei Terme ist kein Problem und mathematisch kann man den ersten Term zu r = (-3-s)/3 umwandeln und dann in eine anderen Gleichung einsetzen.
Aber läuft so etwas programmiertechnisch ab, ich mein ich kann ja keine Formel schreibe, ohne s zu definieren.

(Mit standard werkzeugen)

20.10.2008 - 20:57 Uhr

Muss ich übersehen haben, jetzt klappt es. Danke 🙂

20.10.2008 - 20:12 Uhr

Ich bin mir nicht sicher,wie das gehen soll, ich hab ja in den Ressourcen eine Datei erstellt und per Copy Paste rein kopiert, C# fragte mich nach keinem Encoding

20.10.2008 - 20:02 Uhr

Und wie soll ich so eine Datei aus den Ressourcen lesen? Es ist keine physikalisch vorhandene Datei

20.10.2008 - 19:55 Uhr

Wie kann ich denn

StreamReader sr=new StreamReader(@"C:\Test\text1.txt",System.Text.Encoding.GetEncoding(1252));
StreamReader sr=new StreamReader(@"C:\Test\text1.txt",System.Text.Encoding.GetEncoding(437));
StreamReader sr=new StreamReader(@"C:\Test\text1.txt",System.Text.Encoding.GetEncoding(850));

benutzen?
Die anderen haben ja alle ne XYEncoding Klasse und mit denen ging es nicht, aber bei denen hier?

20.10.2008 - 19:38 Uhr

Ich hab ne Ressource Textfile in meiner Exe, dort sind Umlaute, ich lese die Datei so aus:


String text = XSD_Console.Properties.Resources.demoxml;


Umlaute sind alle zerstört.

Ich lese die Datei so aus:

UTF8Encoding utf8 = new UTF8Encoding();
                String text = utf8.GetString(utf8.GetBytes(XSD_Console.Properties.Resources.demoxml));

Umlaute alle zerstört.

Wie krieg ich die Umlaute heile aus der Ressource Textfile extrahiert?

14.10.2008 - 21:05 Uhr

Edit: Gelöst

Es war noch n Fragment im Code drin, der unnützerweise n XMLTextWriter erstellt hat, der genauso heißt 😠

14.10.2008 - 21:03 Uhr

Folgender code:


string test = "hallo";
string file = "D:\\output_status.txt";
File.WriteAllText(file,test);


Exception :


Der Prozess kann nicht auf die Datei D:\output_status.txt zugreifen, da sie von einem anderen Prozess verwendet wird.

Stack:
 bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   bei System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   bei System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   bei System.IO.StreamWriter.CreateFile(String path, Boolean append)
   bei System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   bei System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding)
   bei System.IO.File.WriteAllText(String path, String contents, Encoding encoding)
   bei System.IO.File.WriteAllText(String path, String contents)
   bei eFMiddleware.MiddlewareController.writeStatusToFile(String& result, String fileName) in ...Program.cs:Zeile 572.

Die Datei wird hier erst erstellt, niemand greift auf diese Datei zu und ich kann diese Datei problelos löschen.

WriteAllText schließt doch die Datei direkt, warum macht er da solche Probleme?

14.10.2008 - 18:55 Uhr

Aaa, danke dir.

Ich hab das irgendwie mit C++ verwechselt, klar Ressourcen 😠

Danke nochmal

14.10.2008 - 18:46 Uhr

Ich hab ne große Textdatei, die unbedingt in die exe rein muss. Ich will diese also nicht extern verlinken, sondern würde diese gerne, so wie sie ist in die exe integrieren und lesen können.
Datei als String zu speichern ist keine Option (ne Menge escape Zeug usw)

Es ist also nicht direkt etwas, was man gut als eine Zeile irgendwo abspeichert.

12.10.2008 - 20:38 Uhr

Hallo,

ich habe noch eine Frage zu XSLT, ich weiß nun, wo die Probleme mit ner Linearisierung einer Baumstruktur liegen 😁

Meine Frage, ich definiere ja quasi n Schema, anhand welcher XSLT die Daten serialisiert, soweit ok. Ich kann dann meine Elemente nach dem Schema


ElementA|ElementB|ElementC

serialisieren, damit habe ich eine nette csv Datei.

Was ich aber noch nicht begriffen habe, kann ich in dem Schema Metainformationen definieren?
Das Schema da oben füllt mir meine 3 XML Elemente brav in eine Reihe, aber kann ich zusätzlich am Anfang der Zeile noch definieren, dass er die Anzahl der Elemente zählen soll?

09.10.2008 - 21:47 Uhr

Ich beschreibe mal mein Problem genauer:

Ich bekomme eine XSD geliefert, die beispielsweise diese XMLs generiert:


<root>
 <header>...</header>
 <elementA />
</root>
// oder
<root>
 <header>...</header>
 <elementB />
</root>
....

Dh also einige Teile der XML wiederholen sich immer, wie der header, andere Elemente sind optional, also header und elementA oder header und elementB usw.

Mein Vorhaben funktionierte so:
Mittels XSD generiere ich Klassen aus der XSD, diese haben den Namespace "aa". Arbeite mit den Klassen ganz normal und serialisiere diese Klassen dann wieder.

Dabei benutze ich Methoden zur Generierung der Elemente, Beispiel:


public aa.RootType createRoot(){createHeader(); createElementA();...}
public aa.HeaderType createHeader();
public aa.ElementAType createElementA();

Man beachte den Namespace. Ich habe dann ein RootType, welches ich mittels dem XML Serializer in eine saubere XML umwandeln kann. Dies funktioniert einwandfrei.

Nun ist der Fall eingetreten, dass ich weitere XSD bekomme, Beispielsweise:


<root>
 <header>...</header>
 <ganzNeuesElementA/>
</root>

D.h. eine XSD bei der völlig neue Elemente hinzu kommen, teilweise sehr viele in vielen verschiedenen Abstufungen.
Das Problem nun, ich bekomme daraus mit xsd.exe wieder Klassen, mit dem Namespace bb.

Das Problem: Einige Elemente wie createHeader sind absolut gleich, außer dass der Namespace von aa auf bb gewechselt werden muss, diese Redundanz möchte ich dringend vermeiden.

Wie kann ich dieses Problem angehen? Es gibt in beiden Fällen ein RootType, der gleich aufgebaut ist und es gibt ein HeaderType. Diese dürfen aber nicht vom unterschiedlichen Namespace sein, da der Serializer dies nicht mitmacht.
Von aa.RootType nac bb.RootType kann C# offensichtlich nicht casten (habs probiert)

Eine Lösung wäre: Die Redundanz zu erzeugen, wobei ich wirklich äußert viele Kopien dieser Methoden hätte.

Eine andere Lösung ist nicht praktikabel: Beide XSD Dateien zu mergen. Es sind immer Änderungen, die 500-1000 Zeilen umfassen (nicht meine Idee), dies auch noch an verschiedenen Stellen.

Ihr seht nun mein Dilemma. Ich finde keinen klugen Weg aus dieser Sache.

09.10.2008 - 21:08 Uhr

Wird schwierig bei 180 Klassen, da n Interface reinzuknallen

gibt es eigentlich einen brutalen Weg, etwas zu casten?

09.10.2008 - 20:45 Uhr

Die Klasse ist jedoch nicht generisch, die Methode schon.

Wie kann ich denn dann Ts Methoden nutzen, die als Generic noch nicht bekannt sind?

09.10.2008 - 20:42 Uhr

Jau, in dem gleichen Zuge habe ich ein Problem mit generics.
Ich kann ja schlecht in einer Klasse so etwas schreiben:


public void foo<T>()
{
  T t = new T();
}

09.10.2008 - 20:05 Uhr

Hi,
kann ich ein Alias global deklarieren und im Code ändern? also zweimal using auf selbes Alias wechselt den NS ?