Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Spook
Thema: Frage zu Strings, String-Arrays etc
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Versuch mal das:

Array array = (Array)z.attr[0x4, 0x1500].Value;

Spooky

Thema: Frage zu Strings, String-Arrays etc
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das Array beginnt nicht mit dem Index 0. Daher kannst du es nicht nach string[] casten.
Um auf das Array zugreifen zu können caste es in die Klasse "Array" und benutze die dort angebotenen Methoden.
Hier ein Beispiel:

// Hier kommt dein Objekt rein
Array array = Array.CreateInstance(typeof(string), new int[] { 10 }, new int[] { 1 });

for (int i = array.GetLowerBound(0), j = array.GetUpperBound(0); i < j; i++)
{
	// Mache etwas mit dem Wert
	array.GetValue(i);
}

Spooky

Thema: Methode mit MethodBuilder erstellen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Nuker,

mit ein paar Modifikationen sollte das funkionieren:


static Action<int, string, object> CreateDynMethod()
{
    DynamicMethod dyn = new DynamicMethod("DynamicMethod", null, new Type[] { typeof(int), typeof(string), typeof(object) });
    ILGenerator g = dyn.GetILGenerator();

    // object[] local;
    g.DeclareLocal(typeof(object[]), false); // Index = 0

    // local = new object[3];
    g.Emit(OpCodes.Ldc_I4, 3);
    g.Emit(OpCodes.Newarr, typeof(object));
    g.Emit(OpCodes.Stloc, 0);

    // local[0] = (object)param0;
    g.Emit(OpCodes.Ldloc, 0);
    g.Emit(OpCodes.Ldc_I4, 0);
    g.Emit(OpCodes.Ldarg, 0);
    g.Emit(OpCodes.Box, typeof(int));
    g.Emit(OpCodes.Stelem_Ref);

    // local[1] = param1;
    g.Emit(OpCodes.Ldloc, 0);
    g.Emit(OpCodes.Ldc_I4, 1);
    g.Emit(OpCodes.Ldarg, 1);
    g.Emit(OpCodes.Stelem_Ref);

    // local[2] = param2;
    g.Emit(OpCodes.Ldloc, 0);
    g.Emit(OpCodes.Ldc_I4, 2);
    g.Emit(OpCodes.Ldarg, 2);
    g.Emit(OpCodes.Stelem_Ref);

    // CallMethod("DelegatedA", local0);
    g.Emit(OpCodes.Ldstr, "DelegatedA");
    g.Emit(OpCodes.Ldloc, 0);
    g.Emit(OpCodes.Call, typeof(Program).GetMethod("CallMethod", BindingFlags.Static | BindingFlags.Public));

    // return;
    g.Emit(OpCodes.Ret);

    return (Action<int, string, object>)dyn.CreateDelegate(typeof(Action<int, string, object>));
}

Wenn du wieder eine Methode erstellen willst, ist es am einfachsten die Methode zu implementieren und denn vie Reflector sich die OpCodes anzeigen zu lassen.

Spooky

Thema: Abstrakte Klasse, welche meherere Interfaces "bündelt"
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

Zitat von serial
Allerdings kann ich ja die in den interfaces deklarierten methoden/properties in der klasse nicht als abstrakt kennzeichnen ...

    abstract class Test : IDisposable, IComparable<Test>
    {
        public abstract void Dispose();
        public abstract int CompareTo(Test other);
    }

Wieso sollte das nicht gehen?

Spooky

Thema: [erledigt] mit Reflection Wertetypen erzeugen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo impact,

meinst du das?

double d = (double)Activator.CreateInstance(Type.GetType("System.Double"));

Spooky

Thema: Control.Invoke auch bei Lesezugriffen nötig?
Am im Forum: GUI: Windows-Forms

Zitat von Aschratt
Also ist eine Übergabe byValue nur Scheinbar byValue, weil in Wirklichkeit nur die Referenz des Objekts übergeben wird

Eine Übergabe "By Value" heisst, dass der Inhalt der Variablen kopiert wird (Value => Inhalt). "By Reference" heisst, dass ein Zeiger auf die lokale Variable übergeben wird.

Beispiel:


string str = "Hallo"; // str ist 4 bytes groß (auf 32 bit System)  und könnte nun zB 0x85AB5038 sein
Test(str);

int i = 5; // i ist 4 Bytes groß und beinhaltet 0x00000005
Test(i);

//

void Test(string s)
{
  // s ist 0x85AB5038
}

void Test(int t)
{
  // i ist 0x00000005
}



Sowohl bei Verweistypen als auch bei Werttypen wird der Wert der Variablen kopiert (was bei Werttypen logischerweise der Wert selber ist bei Referenztypen die Referenz).

Was man nicht vergessen darf ist, dass C# bei der Benutzung von "ref" oder "out" für uns automatisch die aus C/C++ bekannte Dereferenzierung macht und vor dem Programmierer versteckt (was man schön sieht, wenn man sich Code zB im Reflector in IL anschaut).

Thema: Plugin: Exception beim Abonnieren eines Events
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

füge zu deinem "Host" Projekt eine "Application Configuration File" hinzu mit diesem Inhalt:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Plugins"/>
    </assemblyBinding>
  </runtime>
</configuration>

Das Problem ist, dass die aufrufende AppDomain die Assembly ebenfalls finden muss. Da sie aber nur im eigenen Ordner sucht, kann sie diese nicht finden.

Spooky

Thema: Bildschirmauflösung eines Spiel abfragen.
Am im Forum: GUI: Windows-Forms

Hallo,

als erstes solltest du diese Definition der API Funktion verwenden:


        [DllImport("user32.dll", SetLastError = true)]
        static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

Der Fehler kommt daher, dass du eine Methode ohne Implementierung deklariert hast:

static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);

Wenn du extern angibst, musst du auch das DllImport Attribut angeben.

Spooky

Thema: [gelöst] Marshaling einer Struct mit String und embedded Array
Am im Forum: Rund um die Programmierung

Hallo Khalid,

vielen Dank für die Lösung.
Jedoch frage ich mich, warum er beide Fälle seperat marshalen kann, zusammen aber nicht.

Spooky

Thema: [gelöst] Marshaling einer Struct mit String und embedded Array
Am im Forum: Rund um die Programmierung

Hallo zusammen,

ich möchte eine C-Struct in C# verwenden. Bisher hat dies auch immer ohne Probleme geklappt jedoch ist es diesmal die erste Struct, die ein embedded Array beinhaltet.
Die Struct sieht folgendermaßen aus (Beispiel):

typedef struct
{
	int	ID;
	char*	Name;
	double	Data[6];
	int	Reserved;
} TestStruct;

Die Struct wird mit folgender Beispielfunktion gefüllt:
void* DLL_EXPORT GetData(TestStruct* ptr)
{
	int i;

	if (ptr)
	{
		ptr->ID = 1;
		ptr->Name = "Dies ist ein Teststring";
		for(i=0;i<6;i++)
			ptr->Data[i]=(double)(i+100);
		ptr->Reserved = -1;
	}

	return ptr;
}

In C# habe ich diese so eingebunden:

[DllImport("library.dll")]
public static extern IntPtr GetData(out TestStruct t);

Wenn ich nun die Struct wie folgt in C# deklariere, wird der String automatisch gemarshalt, so wie man es erwartet. Die beiden Ints sind ebenfalls gesetzt. Jedoch wird im embedded Array nur der erste Eintrag gesetzt, die anderen sind 0.

	unsafe struct TestStruct
	{
		int ID;
		string Name;
		fixed double Data[6];
		int Reserved;
	}

Deklariere ich die Struct um, so dass der String nicht gemarshalt werden muss, wird das embedded Array normal gefüllt:

	unsafe struct TestStruct
	{
		int ID;
		char* Name;
		fixed double Data[6];
		int Reserved;
	}

Wie es scheint, wird das embedded Array nicht korrekt kopiert, sobald der Marshaler eine Kopie der Struct erstellen muss (was er für den String in der ersten Implementierungsvariante muss).

Kennt jemand eine Möglichkeit den char-Pointer elegant als String zu marshalen und gleichzeitig ein embedded Array zu nehmen?

Spooky

Thema: Click Once VersionsNummer zur Laufzeit ermitteln
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo northdrive,

Diese Klasse sollte dir weiterhelfen:

System.Deployment.Application.ApplicationDeployment


Spooky

Thema: Type (dynamisch) zum Casten benutzen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

du könntest dies versuchen:

string value = "4123";
long l = (long)Convert.ChangeType(value, typeof(long));

Spo

Thema: Wort in Buchstaben zerlegen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

string text = "hallo";
char[] testArr = text.ToCharArray();

Thema: Hexadezimal-Konstante als int
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

Zitat von Thomas123
In der Dokumentation ist auch ein Fehler, dort ist Error nämlich als long deklariert, aber die Bibliothek gibt wirklich nur einen int.

Ich vermute, dass es sich bei dem "long" um ein C long handelt, dass 32 bit groß sein kann. Das long aus C# wäre ein long long.

Wikibooks

Spo

Thema: Generischer Typ soll serialisierbar sein
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo void,

interface I<T> where T : SerializableAttribute 

sagt nicht aus, dass T mit dem Attribut markiert ist sondern, dass es davon ableitet.
Die Bedingung die du ausdrücken möchtest ist so denke ich nicht möglich, aber vielleicht kennt sich da noch jemand besser aus.

Spo

Thema: Generischer Typparameter T ist erst zu Laufzeit bekannt!?
Am im Forum: Rund um die Programmierung

Hallo Gepro,

ich habe zwar im Moment kein VS2008 zur Hand, aber versuche einmal

var dbObject = dbContext.ExecuteQuery<T>(command, new object[0]).First();

durch

T dbObject = dbContext.ExecuteQuery<T>(command, new object[0]).First();

zu ersetzten.

Spo

Edit:

Welche Signatur hat dbContext.ExecuteQuery<T>?

Thema: Programm in den Vordergrund holen
Am im Forum: GUI: Windows-Forms

Hallo Ainairos,

bei mir bringt folgender Code den von dir gewünschten Effekt:

private void ShowWindow()
{
    WindowState = FormWindowState.Normal;
    SetForegroundWindow(Handle);
}

[DllImport("user32")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

Spo

Thema: wachsende datei einlesen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Nullpunkt,

du könntest die Datei zeilenweise mit Hilfe des StreamReaders einlesen und die jeweils eingelesene Zeile direkt verarbeiten. So bleibt der Speicherverbraucht niedrig.

Spo

Thema: wachsende datei einlesen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Nullpunkt,

File.ReadAllLines(string path, Encoding encoding)
oder
StreamReader.ReadLine()

könnten interessant sein.

Spo

Thema: [gelöst] Assembly in AppDomain laden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Nuker,

ich habe dieses Problem ebenfalls schon gehabt.
Du kannst nur Assemblies laden, die im Ordner deiner Executable (oder einem Unterordner dessen) liegen.
Bevor du

m_AppDomain.Load(asseblyRef)
aufrufst, musst du den Unterordner (falls vorhanden) angeben:

AppDomain.CurrentDomain.AppendPrivatePath("Plugins\\Plugin1");
Danach kann die Assembly gefunden werden.

Spo

Thema: Performance: == Oder Equals()
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo tkrasinger,

Guidelines for Implementing Equals and the Equality Operator ==

könnte dir weiterhelfen.

Spo

Thema: Marshalling: Wie groß soll das Array werden?
Am im Forum: Rund um die Programmierung

Hallo Matthias,

am schnellsten wäre es, wenn du alle Structs als serialisierbar markierst und diese in einen FileStream serialisierst.

Speichern

BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);

Laden

BinaryFormatter formatter = new BinaryFormatter();
T obj = (T)formatter.Deserialize(stream); // In den richtigen Typ casten

Spooky