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: DLLImport: Wie void* als Parametertyp umsetzen?
Am im Forum: Rund um die Programmierung

Hallo,

das out ist nicht nötig, da .NET den Zeiger auf das erste Array-Element übergibt und die Daten direkt in dieses geschrieben werden (genau das, was vorher manuell mit unsafe erreicht werden sollte).

Spooky

Thema: DLLImport: Wie void* als Parametertyp umsetzen?
Am im Forum: Rund um die Programmierung

Hallo,

Wenn ich mir die Funktion so ansehe, gehe ich einmal davon aus, dass Parameter "Buff" ein Buffer ist in den etwas geschrieben wird, welcher die Länge "BuffLen" hat.
Das ganze funktioniert auch ganz ohne unsafe code:


[DllImport("CANAPI2.dll", EntryPoint = "CAN_GetHwParam")]
public static extern uint GetHwParam(byte hHw, ushort Param, byte[] Buff, ushort BuffLen);

...
const int buffLength = 1024;
byte[] buffer = new buffer[buffLength];
uint result = GetHwParam(0, 0, buffer, buffLength);

...


Ob die Funktion bytes, shorts, ect erwartet musst du der API entnehmen.

Spooky

Thema: Optimierung, Umwandeln von BitArray in Long und umgekehrt
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

zum ersten ist ein long in .NET 64 Bit groß (int wäre 32 falls du das eigentlich wolltest).

Du könntest das so realisieren:


		public static int GetInt32(BitArray array)
		{
			int[] value = new int[1];
			array.CopyTo(value, 0);
			return value[0];
		}

		public static BitArray GetBitArray(int value)
		{
			return new BitArray(BitConverter.GetBytes(value));
		}

spooky

Thema: Clipboard und IEnumerable
Am im Forum: GUI: Windows-Forms

Hallo Master15,

verwende anstatt "IEnumerable<Grafikobjekt>" "Grafikobjekt[]".

Spooky

Thema: Wie binde ich die mitgelieferte DLL in mein Programm ein?
Am im Forum: Rund um die Programmierung

Hallo Todesengel,

vermutlich ist diese dll für 32bit compiliert. Die .NET Anwendung passt sich allerdings dem OS an und läuft nun als 64bit, was so nicht funktionieren kann, da Pointer unter 32bit und 64bit unterschiedlich groß sind.

Entweder das .NET Programm fest für 32 bit compilieren oder eine 64bit Version der dll verwenden.

Spooky

Thema: Methode aus Assembly/DLL laden und ausführen...
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo kds,

hier ein kleines Beispiel...

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly a = Assembly.GetEntryAssembly(); // Hier ist die gelandene Assembly
            // Der exakte Name incl. Namespace
            Type t = a.GetType("ConsoleApplication1.Hallodll");
            // Instanz erzeugen, da Hallo() nicht statisch ist
            object o = Activator.CreateInstance(t);
            // Auf der Instanz die Methode aufrufen
            t.InvokeMember("Hallo", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, o, null);
            // Ohne Instanz die statische Methode aufrufen
            t.InvokeMember("HalloStatic", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
        }
    }

    class Hallodll
    {
        public void Hallo()
        {
            Console.WriteLine("Hallo");
        }

        public static void HalloStatic()
        {
            Console.WriteLine("Hallo");
        }
    }
}

Spooky

Thema: Probleme beim überladen von Operatoren in generischen Klassen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Gogonfa,

falls du .NET 3.5 verwendest, könntest du dir mal folgende Lib anschauen:
http://www.yoda.arachsys.com/csharp/miscutil/

In dieser gibt es eine Klasse (MiscUtil.Operator<T>) mit der generische Operatoren möglich sind wie zB:


...
T t = Operator<T>.Add(val1, val2);

Spook

Thema: [erledigt] DLL benutzen (DevIL.NET/.pcx Anzeigen)
Am im Forum: Rund um die Programmierung

Hallo hackfix,

ich habe eben die Version 1.3 herunter geladen und mal getestet.
Du musst einen Verweis auf die Datei "DevIL.NET2.dll" in dein Project einfügen.
Danach kannst du mit der Klasse "DevIL.DevIL" Bilddateien laden.

Bitmap bitmap = DevIL.DevIL.LoadBitmap(@"......");
pictureBox.Image = bitmap;

Zusätzlich muss du noch die Datei "DevIL.dll" ins Ausgabeverzeichnis kopieren (die Datei ist die eigentlich Bibliothek, die anderen der .NET Wrapper).

Spooky

Thema: [gelöst] Warum sind die Klassen im Framework nicht partial?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von Golo Roden
Nur würde ich mal behaupten, dass es keinen Unterschied macht, ob eine Methode statisch ist oder nicht, sobald ich mindestens eine Instanz erstellt habe.

Das ist auch der Fall, daher meine Verwunderung.

Thema: enum Flag auflösen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo lord_fritte,

Du könntest diesen Ansatz anschauen/erweitern:

static T[] Factorize<T>(T value) where T : struct
{
	Type type = typeof(T);

	if (!type.IsEnum)
		throw new ArgumentException("value");

	List<T> result = new List<T>(64);
	ulong bitField = Convert.ToUInt64(value);
	ulong bit = 1;

	for (int i = 0; i < 64; i++, bit <≤ 1)
	{
		ulong u = (bitField & bit);
		if (u != 0)
		{
			result.Add((T)Enum.ToObject(type, u));
		}
	}

	return result.ToArray();
}

Spooky

Thema: [gelöst] Warum sind die Klassen im Framework nicht partial?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat
Ist alles Speicher, der während der Ausführung permanent belegt ist.
Auf was genau beziehst du diese Aussage?

Thema: Dllimport in C# aus einer c++ DLL mit struct und Array
Am im Forum: Rund um die Programmierung

Hallo st0ne,

die C# Definitionen sollten so aussehen unter der Annahme, dass UCHAR ein 8-bit unsigned integer ist. Wenn nicht diesen einfach anpassen:

[Serializable, StructLayout(LayoutKind.Sequential)]
public sealed class eeprom_prodid
{
	public UInt16 sn;
	public UInt16 prodcode;
	public SByte hwrel;
	public SByte hwver;
	[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
	public SByte[] signature;
}

public class Native
{
	[DllImport("name_meiner_dll", EntryPoint = "funktionsname_in_der_dll")]
	public static extern int ExternalEepromRead(eeprom_prodid prodid, UInt32 addr, SByte count);
}

Spooky

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