Vielen Dank, jetzt funktioniert es so wie es soll. Da habe ich wohl eine sehr große Lücke bei den Grundlagen, wenn ich nichtmal so etwas - in meinem Fall zumindest - triviales entdecke.
arena_blau schrieb:
Warum braucht man einen Wrapper?
Du kannst nicht einfach so eine C Bibliothek in C# einbinden. Entweder musst du die C Funktionen über P/Invoke aufrufen, was eher teuer ist und dadurch ungeeignet für sowas wie OpenGL oder dann einen Wrapper in C++/CLI bauen. OpenGL ist halt eine C Bibliothek und damit unmanaged, während C# im managed Bereich ist. Man muss da irgendwie eine Brücke bauen.
arena_blau schrieb:
Was macht dieser genau?
Die Darstellungen von Objekten im Speicher ist in C#, bzw. dem managed Bereich, anders als in C, bzw. dem unmanaged Bereich. Daher müssen Konvertierungen der Daten durchgeführt werden, wenn man aus C# eine C Funktion aufrufen möchte oder umgekehrt. Auch werden Funktionen anders aufgerufen, der Wrapper delegiert die Aufrufe korrekt weiter und sorgt für die richtigen Aufrufkonventionen.
arena_blau schrieb:
Und welchen Wrapper verwendet man am besten?
Da bin ich überfragt. Ich kenne nur The Open Toolkit Library, welches z.B. bei Mono zum Einsatz kommt.
Grüssli
Ich Tendiere eher zu dem XDocument.
z.B in der langform
XElement mainElement = new XElement("Main");
XElement definitionElement = new XElement("Definition", "Definition");
mainElement.Add(definitionElement);
XDocument document = new XDocument(new XDeclaration("1.0", "utf-8", "no"), mainElement);
document.Save(myFileName)
;
oder direkt
var doc = new XDocument(new XDeclaration("1.0", "utf-8", "no"), new XElement("Main", new XElement("Definition", "Definition")));
doc.Save(myFileName);
XmlDocument ist da ziemlich hässlich, es gibt viele Restriktionen, zb kann man da nicht einfach mit Select komplette listen einmal speichern lassen, und auch beim schreiben muss man die Formatierung mitgeben usw.
XDocument und dessen XElement ist da um Welten dynamischer.
Du könntest auch einfach bevor du den Wert setzt den EventHandler "aushängen" also deregistrieren:
checkbox1.OnCheckChanged -= OnCheckChangedEventhander;
checkbox1.checked = value;
checkbox1.OnCheckChanged += OnCheckChangedEventhander;
Hi, setz am möglichen Wert einen Breakpoint und öffnen dann dessen Kontextmenü, da sind dann diverse Möglichkeiten bzw Bedingungen das Auslösen des Breakpoints zu steuern.
Hellsgore schrieb:
Servus,
du kannst leider nicht auf eine in 32 Bit (x86) kompilierte Native DLL mit einer in 64 Bit (x64) kompilierten Applikation zugreifen. Das geht in die Hose. Du hast jetzt die Möglichkeiten, deine Applikation mit x86 zu kompilieren oder deine DLL in (x64).
Mache ich doch. Jeweils stammen die Zielarchitekturen überein (x86/x64).
C.
ich123123123 schrieb:
nein... icq muss auch empfangen.... das war meine frage^^
Um zum epfangen brauchst Du eine Verbindung. Und die baut der Client auf.
Sobald die Verbindung steht, kann gesendet UND emfpangen werden.
Ev. das ein Buch für dich:
Computernetzwerke | ISBN: 9783827370112
knivil schrieb:
Ist eine Gabel vor Fehlbenutzung abgesichert. Nein, man sagt einfach, dass man damit keine Augen ausstechen soll. Wenn ich mir die Vorschlaege so durchlese ist ein Kommentar oder Dokumentation die beste Wahl.
Unter C oder C++ würde ich dir wahrscheinlich zustimmen, aber bei C# ist die Philosophie eher anders. Ich habe noch keine Bibliothek gefunden, welche einen undefinierten Zustand hatte. Wenn es denn einen gab, dann wurde beim Aufruf einer Funktion eine weitere Exception geworfen, dass das Objekt eben in einem undefiniertem Zustand ist.
hustbaer schrieb:
In dem Fall zahlt es sich nicht aus, also dafür z.B. extra irgend welchen C++/CLI Code zu schreiben macht IMO wenig Sinn.
Ich verwende allerdings bereits C++/CLI
hustbaer schrieb:
Dürfen denn anderen Threads auf "B" zugreifen während gerade Step 3/4/5 ausgeführt wird? Wenn ja könnte es tricky werden.
Ja können sie. Allerdings war ich mir nicht mehr so klar, wie genau der Zugriff erfolgt, da der Teil der Bibliothek nicht von mir stammt. Habe das nun nochmals nachgeprüft und wie es aussieht, haben sie grundsätzlich getrennte Instanzen. Es gibt zwar eine Überschneidung, welche aber durch einen Fehler nicht betroffen und somit weiterhin in einem gültigen Zustand wäre.
Ein weiteres Problem ist, dass auch in einem Thread verschiedene Instanzen von B zusammenhängen können. Diese bilden grundsätzlich eine Art von Baum. Und ich habe Zugriff von den Kindknoten zum Wurzelknoten, wodurch ich das Flag in den Wurzelknoten packen kann. Und ich habe herausgefunden, dass ich dadurch gleich noch eine weitere Sicherheitsfunktion einbauen kann, damit man nicht zum falschen Zeitpunkt auf ein B zugreift.
Also schlussendlich scheint es, als wären alle Probleme gelöst. Vielen Dank für die Diskussion.
Grüssli
Ja, es wird ja keine Kopie des Objektes angelegt, aber es wird eine neue Referenz auf das Objekt angelegt. Über diese Referenz kann ich dann natürlich das Objekt auch editieren.
Ist wie gesagt, das gleiche wie wenn ich in C++ eine Methode mit einem Pointer aufrufe (was auch oft fälschlicherweise als Call By Reference bezeichnet wird). Man kann auf das Objekt über den Pointer zugreifen und verändern. Wenn ich allerdings den Pointer als Rückgabewert verwenden will (d.h. ändern, z.B. weil ich mehrere Rückgabewerte brauche), muss eine Referenz auf einen Pointer übergeben werden.
In C# passiert hinter den Kulissen genau das gleiche (bei Klassen, bei Structs wird ohne das "ref"-Keyword tatsächlich eine Kopie übergeben).
Ich habe das Beispiel von dieser Seite exakt so verwendet:
string GetADUserGroups(string userName) {
DirectorySearcher search = new DirectorySearcher();
search.Filter = String.Format("(cn={0})", userName);
search.PropertiesToLoad.Add("memberOf");
StringBuilder groupsList = new StringBuilder();
SearchResult result = search.FindOne();
if (result != null)
{
int groupCount = result.Properties["memberOf"].Count;
for(int counter = 0; counter < groupCount; counter++)
{
groupsList.Append((string)result.Properties["memberOf"][counter]);
groupsList.Append("|");
}
}
groupsList.Length -= 1; //remove the last '|' symbol
return groupsList.ToString();
}
Abgesehen von dem kleinen Fehler, dass hier immer "groupsList.Length -= 1" gemacht wird und es daher ggf. eine Exception gibt, schien der Code für mich in Ordnung zu sein.
Das Problem ist, dass ich jedoch für ein Konto, was definitiv mehreren Domänen-Gruppen zugeordnet ist, immer als einziges Ergebnis
CN=Domänen-Benutzer,CN=Users,DC=mydomain
Was mache ich noch falsch?
David W schrieb:
Dein EnumHelper brauchst du auf jeden fall nicht, Enum.GetNames macht das bereits
Bei mir (SL 4.0) hat die Enum Klasse nur eine Methode "GetName", aber nicht "GetNames"
für mich hat es sich so gelesen, dass das Problem dort darin bestand, dass es auf einem anderem Betriebssystem nicht funktioniert hat.
Mein Problem besteht aber darin, dass es das Event nicht erkennt, weil das alte Programm in Multibytecode geschrieben ist und das neue Programm in Unicode. Weswegen das neue Programm den Namen des Events nicht erkennt, weil es die Strings nicht vergleichen kann. (Was sich in den letzten Stunden durch ständiges testen rauskristalisiert hat und ich im Ausgangsthread auch schon vermutet habe)
Wir sind jetzt dabei das alte Programm so umzustricken, dass der Name des Events ebenfalls in Unicode ist. Dann wird es erkannt. Was aber auch problematisch ist, da es von meinem neuen Programm eine alte Version gibt, die auf das Event in Multibyte reagiert. Deswegen suche ich noch nach einer Lösung, mein Programm so abzuändern, dass ich auf das Event in Multibytecode reagieren kann. Bisher habe ich dazu noch nichts gefunden. Vielleicht weil ich die Suche auch falsch angegangen bin. Ich weiß es nicht.
über x:Name einen Namen zuweisen:
<ModelUIElement3D x:Name="cube1" MouseDown="UIElement3D_MouseDown">
Dann im c#-Teil drauf zugreifen...
object ui3 = Viewport3D1.FindName("cube1") as object;
Gruß
Darlo