In System.Collections gibt es da wohl nichts. Aber du könntest dir eine Klasse schreiben die eine Hashtable kapselt und einen Indexer implementieren, der dann für einen entsprechenden Key eine ArrayList mit den Values liefert. So würdest du dir zumindest die expliziten Downcasts der normalen Hashtable sparen.
Hi!
So beginnt eine C++.net-Anwendung:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
Application::Run(new Form());
return 0;
}
Ich wüprde daraus schließen das lpCmdLine die Kommandozeilenargumente enthält. Wenn du diese weiter in deinem Programm benutzen willst, kannst du sie ja an den Konstruktor der Klasse übergeben, wodurch der grafische Teil deiner Anwendung gestartet wird. Also an folgender Stelle:
Application::Run(new Form( /* _HIER_ */ ));
Dort kannst du es dann ja durch weitere Klassen oder so weiterbearbeiten lassen.
Code-Hacker
Siehe Noodles.
2 oder mehr Assemblys (Auch exakt mit dem gleichem Namen,Namespace,Klassen) können im GAC installiert werden. Die Configdatei ist da nicht sooo wichtig.
In deinem Fall:
D.dll vom Hersteller A ist im GAC
D.dll vom Hersteller B ist parallel zu D.dll(von A) im GAC.
Anwendung A.exe bezieht sich per Referenz auf D.dll(von Hersteller A!!!)
Anwendung B.exe bezieht sich per Referenz auf D.dll(von Hersteller B!!!)
.Net passt auf, dass sich die Assemblys nicht in die Quere kommen. Das ist ja auch der Sinn der Sache. Man wollte eine weitere dll-Hell unter Windows ausschließen.
Des Rätsels Lösung ist, du musst deinen eigenen Collection-Typ definieren und in der abgeleiteten Klasse die Controls-Property neu definieren. Hier ein kleines Beispiel:
class MyUserControlItem:UserControl
{
}
class MyItemCollection
{
private ArrayList _alItems;
public MyUserControlItem this[int index]
{
get
{
return (MyUserControlItem)_alItems[index];
}
set
{
_alItems[index]=value;
}
}
public MyItemCollection()
{
_alItems=new ArrayList();
}
public void Add(MyUserControlItem item)
{
_alItems.Add(item);
}
}
class MyUserControl:UserControl
{
private MyItemCollection _items;
public new MyItemCollection Controls
{
get
{
return _items;
}
}
public MyUserControl()
{
_items=new MyItemCollection();
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
MyUserControl ctrl = new MyUserControl();
ctrl.Controls.Add(new MyUserControlItem());
}
}
hmm, vielleicht hab ich mich schlecht ausgedrueckt. vielleicht ist workflowengine die falsche bezeichnung - neue Begriffe: jobmanagement, worklist, taskmanager, scheduler. Das zielt alles in die Richtung.
Weiss jemand eine Stelle im Netz wo ich Hilfe bekommen koennte? (Forum, Codeansammlung, Diplomarbeit...) Darf auch englischsprachig sein!
Ja geht, mit:
System.Runtime.InteropServices.Marshal.StructureToPtr( ... )
Sollte es zu laufzeitfehler kommen, musst du die Struct exakt nach bilden
d.h. du musst folgendes setzen
[System.Runtime.InteropServices.StructLayout( System.Runtime.InteropServices.LayoutKind.Explicit ) ]
struct test
{
[System.Runtime.InteropServices.FieldOffset(4)]
public int Wert;
}
Nur so läst dotnet deine struct in Ruhe
Wie der interpreter schon angedeutet hat, ist int ein value-Typ und um eine Referenz zu speichern brauchst du einen Referenz-Typ. Daher muss ein Wrapper benutzt werden und auf ref kann man dann verzichten. Zum Beispiel so:
class IntWrapper
{
private int _theValue;
public IntWrapper(int theValue)
{
_theValue=theValue;
}
public static IntWrapper operator ++(IntWrapper i)
{
i._theValue++;
return i;
}
public static implicit operator int(IntWrapper i)
{
return i._theValue;
}
}
class Incrementor
{
private IntWrapper _num;
public Incrementor(IntWrapper num)
{
_num=num;
}
public void Increment()
{
_num++;
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
IntWrapper n = new IntWrapper(5);
Incrementor inc = new Incrementor(n);
inc.Increment();
Console.WriteLine(n);
}
}
Hi
weis jemand wie man bestimmte bereiche aus einem Excelsheet in ein DataSet bekommt? Im Moment mache ich das so(siehe Code), allerdings werden mir hier alle daten aus einem definieren Bereich ausgegeben(sieh SQL String). Kann ich das auch so machen das ich sage:"Nimm alles von A1 bis A5 und E1 bis E5", wenn das geht wie baue ich dann den SQL string?
Hier mein Code
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+
@"Data Source=d:\test.xls;Extended Properties=Excel 8.0");
OleDbDataAdapter da = new OleDbDataAdapter("Select * from rangliste",con);
DataSet ds = new DataSet();
try{
con.Open();
da.Fill(ds);
}
finally
{
con.Close();
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
}
}
Hi weiß´jemand ob es eine Möglichkeit gibt mir nicht nur einenm ToolTip für ein Steurelement anzeigen zulassen sondenr auch für die Elemente eines ListViews?
Oder kennt jemand noch ne elegantere Method´???
(Wenn möglich in die Richtung c#)
Hallo ich hab meine Probleme mit TcpListener und Multithreading.
Ich will ein Programm in C# schreiben das als Server arbeitet und mit dem TcpListener auf eingehende Verbindungen wartet, dabei soll man ja mehr als eine Verbindung auf ein Port machen können. Ich krieg aber immer eine Socket Fehlermeldung:
"Ein Socketvorgang konnte nicht ausgeführt werden, da dem System Pufferspeicher fehlte oder eine Warteschlange voll war."
Hier ist der Code: So siehts ungefähr aus. Um zu sehen wie ich das mit dem Multithreading gemacht habe:
public class TcpServer
{
private Socket tcpRohr;
private void start()
{
try
{
TcpListener listener = new TcpListener(IPAddress.Loopback, this.port);
listener.Start();
while(true)
{
if(currentUser < maxUser)
{
// Accept blocks until a client connects
TcpServer tcpServer = new TcpServer(port, maxUser);
tcpServer.tcpRohr = listener.AcceptSocket();
socketAus = false;
// Process the client connection on a new thread
Thread threads = new Thread(new ThreadStart(tcpServer.datenVerkehr));
threads.Start();
currentUser += 1;
}
}
}
catch( SocketException socketEx )
{
MessageBox.Show("Fehler Listener: "+socketEx.Message,"Socket Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
Also wie gesagt, funktioniert das nicht. Wie muss ich denn generell den TcpListener laufen lassen damit ich mehrere Verbindungen behandeln kann. Bekanntlich ist ja Multithreading die einzige Lösung um an einem Port mehrere eingehende Verbindungen zu bekommen.
Nicht so ohne weiteres. Da C++ leider keinen einheitlichen Mechanismus/Format bietet, Klassen für andere Programmiersprachen zu exportieren sind. Leider kocht da jeder Komilerhersteller sein eigenes Süppchen.
Du kannst eine puren C Wrapper schreiben der deine Klassen kapselt. Und dann mit pinvoke importieren. Ist aber recht umständlich. Außer du schreibst ein Programm das diese Wrapper automatisch generiert.
Eine bessere Möglichkeit ist deine C++ Klassen im Managed C++ zu kompilieren. MS hat die Komandozeilenversion von MS C++ 7.0 zum Download frei gegeben. Deinen Code musst du allerdings anpassen, dafür aber sollte es dann möglich sein, deine auf managed getrimmte Klasse ohne Probleme in einzubinden.
Grundsätzlich kann ge"jit"teter Code (theoretisch) genau so schnell sein wie nativer, wenn man mal von einer kleinen Verzögerung am Anfang absieht. Das hat ja interpreter schon gesagt.
Eine .net Anwendung läuft nur mit dem Framework zusammen. Es reicht ja nicht aus einfach von IL nach x68 zu konvertieren. Deine Anwendung ist auf Assemblies im GAC angewiesen. Du kannst nur auf zukünftige Versionen von Windows hoffen, wo das Framework standardmäßig mitgelifert wird (Ist bei Longhorn ja der fall) oder du musst deinen User auffordern es zu installieren.
Letzteres ist sowiso ratsam, da immer mehr Anwendungen auf .net basieren werden. Selbst das neue Treiberpaket von ATI setzt schon eine .net Framework Installation vorraus.
hi mal wieder,
und auch gleich entschuldigung dass ich so lange nicht geantwortet habe aber dazu war die zeit im moment zu knapp
ich benutze zum (ent)packen die #ziplib von ic#code. die gibts hier:
http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx
viel spass damit
velgreyer schrieb:
Ich hab
using System;
using System.Windows.Forms;
using System.Drawing;
Aber ToString("X") funktioniert Vielen Dank
Grüße, vel
K.
Ich glaube es lag daran, dass es die Klasse Integer garnicht gibt