Laden...

Forenbeiträge von AmpelB Ingesamt 41 Beiträge

15.03.2024 - 09:51 Uhr

Ich habe noch nicht so viel mit dem asynchronen gemacht. Für einen dauerhaften Empfang frage ich mich aber, wie das funktionieren soll.

Ich brauche ja praktisch eine Endlosschleife, in der dauernd auf eingehende Pakete gewartet wird. Also praktisch

while (true)
{
    data = udp.Receive()
    handleData(data)
}

Wenn ich nur ReceiveAsync aufrufe, habe ich dann das folgende:

Der ganze while Loop ist in einem Task, eventuell sogar mein GUI/main task. Dann läuft der Code bis data=udp.ReceiveAsync(). Diese Funktion kommt dann doch gleich wieder zurück. Wenn ReceiveAsync später was empfangen hat, wird "der restliche Code" später im Context des Tasks, in dem ReceiveAsync aufgerufen wurde, ausgeführt. Dafür wird dann doch auch ein Hilfstask erzeugt, oder?

Da ich aus ReceiveAsync aber direkt zurück kommen, wird dann die while Schleife nicht weiter bearbeitet? Dann würde ich  ja direkt wieder ein data=udp.ReceiveAsync aufrufen. Somit hätte ich dann zwei ReceiveAsync aktiv, was ich nicht möchte. Und nach ein paar Millisekunden ergibt das Hunderte.

Oder es funktioniert doch anders. Es wird die gesamte Ausführung der Funktion "pausiert". Die gesamte while Schleife ist also "der restliche Code", der erst ausgeführt wird, wenn Receive etwas empfangen hat. Also wird der nächste Schleifendurchlauf auch erst nach einen Paket Empfang durchlaufen.
Ist das so? Würde für mich Sinn machen.

Im aktuellen .Net (nicht der Version 4.8, die ich bisher noch benutze) gibt es ja auch eine ReceiveAsync Version, der ich ein Cancel Token übergeben kann. Das  kann ich dann benutzen, wenn ich den ganzen UDP Client beenden möchte. Mit dem Cancel Token sollte ich das Receive ja beenden können. Dann kann ich auch die while Schleife beenden.

Ich müsst das ganze mal ausprobieren.

Mit meiner Beobachtung, dass das Receive aber gar nicht mehr funktioniert, wenn ich ein destination unreachable ICMP Paket bekommen habe, hat das aber alles nichts zu tun. Dieses Verhalten könnte sich aber noch als show stopper herauskristalliesieren.

14.03.2024 - 10:11 Uhr

Ich habe gerade folgende Beobachtung gemacht: per UdpClient schicke ich was weg und das Ziel ist nicht da. Mit Wireshark sehe ich, das es eine ICMP port unreachable Antwort gibt. Ok. Aber schicke ich danach was zu mit selber, kommt das bei mir nicht an.

Jetzt der Hintergrund. Als erstes, das Programm läuft mit WinForm und .Net Framework 4.8. Dann habe ich einen Client und einen Server, die über UDP kommunizieren sollen. Sowohl Client als auch Server laufen auf dem gleichen Rechner. Deswegen benutze ich zum Senden der UDP Daten die IP Adresse 127.0.0.1 (loopback). Dann habe ich einen Thread, in dem ich udpClient.Receive(...) aufrufe. Die Receive Funktion ist eine blockierende Funktion.

Wenn ich nun mit dem gleichen udpClient Objekt, bei dem im Thread die Receive Funktion aufgerufen wurde, Daten an mich selber schicke (also 127.0.0.1 als Ziel Adresse und die Portnummer, die udpClient benutzt, als Zielport) funktioniert das. Im Thread komme ich aus dem Receive heraus  und sehe die empfangene Message. Wenn ich vorher aber was an einen anderen Port geschickt habe, und eine ICMP unreachable Message bekommen habe, komme ich aus der Receive Funktion nicht mehr heraus, wenn ich was an mich schicke.

Somit kann ich also nichts mehr an mich schicken. Wieso? Was kann man dagegen machen?

Das "Schicken an mich selber" brauche ich hauptsächlich, wenn ich den udpClient schließen möchte. Ich kann in meinem Hauptthread ruhig ein Close aufrufen. Deswegen komme ich im Thread aber nicht aus der Receive Funktion heraus. Somit hängt der Thread noch und ich kann ihn nicht beenden. Wenn ich aber eine "Schließen Message" an mich selber schicke, kann ich das im Thread erkennen und diesen beenden. Das funktioniert sehr gut. Aber nur so lange, bis ich eine unreachable Message bekommen habe.

Gibt es eine andere Möglichkeit, innerhalb des Threads zu erkennen, dass der Socket geschlossen wurde und dann den Thread zu beenden?

29.12.2023 - 21:44 Uhr

Unglücklicherweise steht hinter den Links keine Lösung. Es steht dort nur, dass es mit aktuellem Android nur über scoped storage geht. Wie das geht, steht dort aber nicht.

Ich hatte das Problem schon mal, als ich ein Programm mit dem Android Studio (also direkt unter Android) geschrieben haben. Dort habe ich auch wochenlang rumprobiert und (auch die genannten) Dokumente / Web Seiten mehrfach gelesen. Mit einem File Picker kann man wohl eine Datei auswählen, für die man dann einen URL Link erhält, den man mit anderen Mapper Komponenten auch öffnen konnte. Aber ein Verzeichnis öffnen und dann auslesen, welche Dateien es dort gibt und einige dann sogar öffnen, habe ich nicht hinbekommen. Ich bin mir auch nicht sicher, ob das überhaupt geht. Allerdings wäre das ja für mich eine Grundfunktionalität eines Android Betriebssystems. Oder man muss sehr aufwendig viele URLs finden und mit irgendwelche Mappern arbeiten.

Ich habe mich damals dazu entschieden, meine Daten im App-Spezifischen Bereich zu speichern und eine IP-Basierte eigene Zugangsfunktion zu implementieren. Das hat insgesamt weniger Zeit gebraucht als ich vorher hineingesteckt habe, um einen "vernünftigen Dateizugriff" zu implementieren.

Die eigene IP-Basierte Zugangsfunktion passte damals recht gut ins Konzept. Jetzt nicht. Ich hatte gehofft, mit dem .Net MAUI gäbe es eine Möglichkeit, auf die "normalen Dokumente" des Benutzers auch in Android zugreifen zu können. Aber die "super" Android Entwickler haben das ja wohl "so toll" implementiert, dass es für "Normalprogrammierer" nicht zu benutzen ist.

Jetzt wird mir auch wohl nur dieser Weg übrig bleiben. Schade.

Oder hat jemand eine funktionierende Lösung?

29.12.2023 - 14:20 Uhr

Ich würde von meiner .Net MAUI Applikation gerne Dateien im Dokumente Ordner eines Android Handys speichern und lesen. Es muss nicht einmal der Dokumente Ordner einer SD Karte sein. Aber das funktioniert nicht.

Zuerst habe ich mein Handy per USB mit dem (Windows) PC verbunden und den Datenaustausch aktiviert. Somit habe ich also die Verzeichnisse auf des Handys auf dem PC gesehen und konnte auch eine Text-Datei (zu Testzwecken) auf das Handy kopieren.

Nun benutze ich den FolderPicker aus dem CommunityToolKit, um den Pfad auszuwählen:

var folderPickerResult = await FolderPicker.PickAsync(CancellationToken.None);

Der funktioniert einwandfrei. Es öffnet sich ein Fenster auf meinem Android Handy und ich kann das entsprechende Verzeichnis auswählen. Ich habe damit auch schon ein Verzeichnis erstellt, welches ich dann auf dem PC auch sehe. In dem Picker-Fenster wird mir auch meine Text-Datei angezeigt, die ich vom PC kopiert habe. Wähle ich im Picker nun das Verzeichnis aus, erfolgt auch die Abfrage, ob ich (weiterhin) Zugriff auf dieses Verzeichnis haben möchte. Das sieht also alles total richtig aus. Als Pfad wird mir

/storage/emulated/0/Documents/Verzeichnis

angezeigt, was ja auch völlig korrekt ist.

Nun möchte ich das Verzeichnis aber in meiner App benutzen, z.B.

           DirectoryInfo directoryInfo = new(VerzeichnisName);
           if (directoryInfo.Exists) 
           {
               Debug.WriteLine("Verzeichnis "+VerzeichnisName+" gibt es: "+directoryInfo.CreationTime);
               FileInfo[] fileInfos = directoryInfo.GetFiles("*.*");
               Debug.WriteLine(fileInfos.Length + " Dateien gefunden");
           }

DirectoryInfo sagt mir, dass es das Verzeichnis gibt und die CreationTime passt auch. Mit GetFiles bekomme ich aber immer "0 Dateien gefunden". Auch die GetFiles() Version ohne Parameter liefert mir keine Datei.

Im Android Manifest meiner App habe ich folgende Permission "angehakt"
- WRITE_EXTERNAL_STORAGE
- READ_MEDIA_AUDIO
- READ_MEDIA_IMAGES
- READ_MEDIA_VIDEO
- READ_EXTERNAL_STORAGE
- MANAGE_EXTERNAL_STORAGE
- MANAGE_DOCUMENTS

Obwohl ich ja nicht mal auf den externen Speicher zugreife, sollte das doch wirklich ausreichen.

Wenn ich die Permissions abfrage, bekomme ich auch immer Denied. Aus ein Request funktioniert nicht und gibt Denied zurück

   public class ReadWriteStoragePerms : Permissions.BasePlatformPermission
   {
       public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
           new List<(string androidPermission, bool isRuntime)>
           {
       (global::Android.Manifest.Permission.ReadExternalStorage, true),
       (global::Android.Manifest.Permission.WriteExternalStorage, true)
           }.ToArray();
   }       
       
       PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.StorageRead>();
       Debug.WriteLine("Check StorageRead status = " + status);
       status = await Permissions.RequestAsync<Permissions.StorageRead>();
       Debug.WriteLine("Request StorageRead status = " + status);
       status = await Permissions.CheckStatusAsync<ReadWriteStoragePerms>();
       Debug.WriteLine("Check ReadWriteStoragePerms status = " + status);
       status = await Permissions.RequestAsync<ReadWriteStoragePerms>();
       Debug.WriteLine("Request ReadWriteStoragePerms status = " + status);

Allerding bekomme ich von DirectoryInfo ja auch keine Exception "No access". Das kam meine ich bei meinen ersten Tests.

Benutze ich den FilePicker (ja direkt in MAUI drin) kann ich meine Test-Datei auch direkt auswählen. Dort bekomme ich aber

 /storage/emulated/0/Android/data/com.companyname.myapp/cache/2203693cc04e0be7f4f024d5f9499e13/c853c2cc6be445ae84107449a540c65f/test.txt

als Pfad. Das ist ja wohl die Cache oder Sandbox Version der Datei. Damit kann ich aber auch nicht arbeiten.

Ich stehe nun ich glaube ich zum dritten Mal vor diesem Problem, was ich bisher noch nicht gelöst bekommen habe. Der bisherige Workaround war dann immer, die Daten in das App-spezifische Verzeichnis zu speichern und mir eine spezielle Export Funktionalität, z.B. über WLAN zu implementiern, um die Daten aus dem Handy zu bekommen. Es wäre aber schön, wenn das mal funktionieren würde und ich die Daten in ein Verzeichnis speichern kann, auf das ich vom PC aus auch zugreifen kann.

Eventuell ist so etwas unter Android aber auch gar nicht möglich.

22.10.2023 - 23:00 Uhr

Sehe ich das eigentlich richtig, dass man mit .Net MAUI nicht auf eine Mouse Down Ereignis reagieren kann?

Wenn ich das richtig sehe, gibt es dort ja "nur" Gesture Recogniser:

  • PanGestureRecognizer
    Der gibt als TotalX bzw. TotalY das Delta bei gedrückter Maus im Event zurück. Auch, ob die Geste gestartet, aktive oder beenet wird. Aber die Position, an der die Geste gestartet wird, gibt es dort nicht. Das Event wird auch erst gefeuert, wenn die Maus bei gedrückter Taste etwas bewegt wird.
  • PointerGestureRecognizer
    Damit bekomme ich jede Mausbewegung mit. Das ist also praktisch eine MouseMove Benachrichtigung. Damit bekommt man aber keine Down/Up Informationen
  • TapGestureRecognizer
    Hier bekommt man nur ein Ereignis, wenn die Maustaste wieder losgelassen wird. Dabei darf die Maus bei gedrückter Taste aber nicht bewegt werden. Das führt dann zu einem PanGesture Ereignis.

Für mehr als 90% der Fälle ist diese Aufteilung ausreichend und generell macht sie auch Sinn. Allerdings möchte ich gerne schon was machen, wenn die Maus nur gedrückt wird. Wenn sie dann ohne Bewegung losgelassen wird, kann das Tab Ergeignis ja ruhig kommen. Und wenn sie bewegt wird, ist das Pan Ereignis auch gut (die Startposition nehme ich mir im Moment halt aus dem PointerGestureRecognizer, der aber dafür immer mitlaufen muss). Aber der spezielle Fall, Maus gedrückt, noch nicht bewegt und auch noch nicht losgelassen, kann nicht abgebildet bzw. erkannt werden.

Ich habe schon einen Hinweis gelesen, dass man so etwas in dem plattformspezifischen Teil selber implementieren kann. Das bräuchte ich dann aber sowohl für Windows und Android. Im Moment habe ich wenig Ahnung, wie so etwas dann wohl implementiert wird.

30.08.2023 - 13:35 Uhr

Die Seite hatte ich vorher auch schon gelesen. Es macht aber keinen Unterschied, ob ich einen Haken bei SEHException mache oder nicht.

Die Settings werden ja auch im popup Fenster der Exception angezeigt. Wenn ich das richtig verstehe, hält der Debugger an, bevor der Exception Handler aufgerufen wird. Also wenn das Häkchen gesetzt ist. Aber wird das nicht sowieso immer schon gemacht? Als Standard sind ja auch die meisten Häkchen nicht gesetzt.

Ich hatte dann auch mal ausprobiert, dass ich zu dem Häkchen noch eine Bedingung gesetzt habe. Aber das macht auch kein Unterschied. In allen Fällen bekomme ich das angehangen Bild.

30.08.2023 - 12:46 Uhr

Ich habe ein merkwürdiges und sehr lästiges Problem, wo ich nicht weiter weiß.

ich habe eine .Net 7.0 Windows Forms Anwendung, die für Windows mit der Zielversion 10.0.19041.0 gebaut wird. Dort spreche ich mit einen HID Device. Das "sprechen" geht in folgenden Schritten:

  • Mit SetupDiGetDeviceInterfaceDetail hole ich mir den DevicePath zum richtigen Gerät
  • Mit CreateFile hole ich ein SafeFileHandle darauf. Diese "Datei" lasse ich bei der gesamten Kommunikation offen.
  • Mit HidD_SetOutputReport und HidD_GetInputReport lese und schreibe ich Daten. WriteFile und ReadFile funktionieren auch. Allerdings isr ReadFile blockierend so dass das Programm steht, wenn im Gerät keine Daten vorliegen. Die Beschreibung des Geräts sagt auch, man sollte per Report auf die Daten zugreifen.
  • Später schließe ich die Datei wieder mit Handle.Close()

Die entsprechenden HID Funktionen sind als DllImport eingefügt. Das ist dann also nativer Code und kein verwalteter.

Lasse ich das nun im Visual Studio Debugger (Debug Konfiguration mit x64) laufen, bleibt er mit einer System.Runtime.InteropServices.SEHException: "External component has thrown an exception." in LibraryImports.g.cs hängen. Die Aufrufliste ist:

  • Kernel32.CloseHandle
  • SafeHandles.SafeFileHandle.ReleaseHandle
  • InteropServices.SafeHandle.IntenalRelease
  • InteropServices.SaveHandle.~SafeHandle

Visual Studio zeigt mir auch an, dass es im GC-Finalizer-Thread passiert.

Ich schließe mein SafeHandle aber gar nicht.

Merkwürdiger ist auch noch, dass das Programm problemlos durchläuft, wenn ich es nicht im Visual Studio (Debugger) laufen lasse, sondern die Exe unter dem bin Verzeichnis starte. Wenn dort die Exception auftreten würde, würde mein Programm doch beendet werden. Und wenn die Exception irgendwo abgefangen würde, würde das doch auch im Visual Studio passieren. Dann könnte ich dort das Programm ja weiter laufen lassen.

Oder hat das was mit GCHandle zu tun? Die nativen Funktionen erwarten einen fixen Datenpointer. Den habe als GCHandle mit

handle = GCHandle.Alloc(ByteArray, GCHandleType.Pinned)

auf mein normales ByteArray erzeugt.

Aber ich lösche doch weder mein Datenhandle (was vielleicht intern auch ein SafeFileHandle benutzt) noch mein Dateihandle.

Wieso kommt dann die Exception? Und dann nur beim Debuggen?

21.08.2023 - 09:22 Uhr

Vielleicht wurde das schon mehrfach diskutiert, ich habe aber nichts passendes gefunden.

Ich würde gerne ein Google Abfrage machen. Erst dachte ich, das ist ja ganz einfach. Ein HttpResponse auf "https://www.google.de/search?q="+suchwort machen. Auf diese Anfrage bekomme ich aber eine HTML Antwort, dass ich mich anmelden soll oder cookies akzeptieren soll.

Dann habe ich mehr gegoogelt und eine custom search engine erstellt, über die man (das ist dann ja wohl die google search api) eine Anfrage mit einem Schlüssel stellen kann. Dort bekomme ich dann auch Suchergebnisse. Diese Ergebnisse sind aber total unterschiedlich zu denen, die ich bei einer Eingabe in meinem Browser bekommen. Das sie leicht unterschiedlich sind, kann ich ja noch verstehen. Aber ich würde sagen, sie sind total unterschiedlich.

Kann man nicht doch den Weg über die "normale" Adresse gehen? In der HTML Antwort, die ich ja auf die einfache (oben angegebene) Adresse bekomme, gibt es einen customButtonContainer mit einem "continue Link". Wenn ich den aufrufe, kommt aber nichts vernünftiges zurück.

Kann ich mit einem (einfachen) C# Programm doch nicht so tun, als wäre ich ein Browser und den HTML Inhalt bekommen, den ich auch im Browser sehen würde?

29.07.2023 - 23:13 Uhr

Das müsste auch "ganz normal zu Fuß" gehen. Zwischen MouseDown und MouseUp bekommt man auch MouseMove Events, wenn man sich außerhalb des Controls befindet. Wenn man also beim MouseDown "nahe genug" am Rand ist, und ein Resize auch möchte, kann man bis zum MouseUp die Mausbewegungen mitbekommen und die neuen Größen ausrechnen.

Eventuell musst du aber noch die Maus Koordinaten auf Screen Koordinaten umrechnen. Wenn z.B. die Maus 3 Punkte nach rechts bewegt wurde und du deswegen Width um 3 erhöht hast, bekommst du eventuell noch ein MouseMove Event mit einer Position, die 3 Punkte links davon ist. Nach einem Umrechnen auf Screen Koordinaten (Control.PointToScreen) ergibt sich aber die gleiche Koordinate.

28.07.2023 - 08:49 Uhr

Zuerst einmal ein Wort zu dem letzten Kommentar:

Sorry, in meiner 30 jährigen Arbeit als professioneller Software Entwickler hatte ich bisher nicht so viel mit den Details der verschiedenen .Net Versionen zu tun. Von daher sehe ich nicht nach 3 Sekunden an einer längeren Liste von vielen Begriffen direkt was das alles bedeutet. Wenn ich alles wüsste, bräuchte ich ja nicht im Forum zu fragen.
Aber da will ich nun nicht drauf rumreiten, obwohl mich diese Antwort (vor allem das zwischen den Zeilen) doch sehr verärgert hat.

Mein Problem ist aber gelöst.

Wie ich ja geschrieben hatte, liegt BLE unter dem Windows Devices Namespace. Der steht aber nur zur Verfügung, wenn man unter "Version des Zielbetriebssystems" eine 10.xy auswählt. Gibt man dort 7.0 an, gibt es Devices nicht mehr. Das macht sogar (auch für mein nicht vollkommenes Wissen, was ich mir aber so zusammengesucht habe) Sinn. Das Net Core ist ja für verschiedene Plattformen gedacht. Selbst wenn ich nun also als Zielbetriebssystem Windows auswähle, dann aber als Version 7.0 auswähle, sage ich praktisch: Nimm nur das, was es auch in anderen Plattformen gibt. Damit fällt Devices raus. Es steht ja auch im Internet, dass Devices aus den höheren .Net Versionen herausgenommen wurde. Nun dachte ich aber, das gilt für das gesamte Framework. Wenn man also in seinem Projekt .Net 7.0 als Zielframework angibt, würde das nicht zur Verfügung stehen. Das ist aber wohl falsch.

Mit der richtigen Version des Zielbetriebssystems kann ich nun auch Code aus den UWP (UWP ist ja per Definition immer nur für Windows) Beispielen benutzen.

27.07.2023 - 13:46 Uhr

Ich habe mir alles heruntergeladen und einiges geschaut und ausprobiert. Ich konzentriere mich jetzt mal auf InTheHand.BluetoothLE.

Das ganze scheint für das .Net Framework zu sein und nicht for .Net Core. Neben der Fehlermeldung, dass ich nicht den richtigen Android API level installiert habe, sagt er, dass .NETFramework V4.6.1 eingestellt ist, was bei mir nicht installiert ist. Ich habe im Projektfile dann alle Zielversionen außer Windows entfernt. Ich habe also nur net7.0-windows10.0.19041.0 übrig gelassen. Damit compiliert es dann.

Das Beispiel (ConsoleBLETest) hat als Zielframework .NET Core 3.1 angegeben. Da sagt er dann, dass man von einer .NETCoreApp kein net7.0... Projekt referenzieren kann. Bei dem DLL Project (also das BluetoothLE Projekt) kann man kein .NET Core als Platform eingeben. Auf der GUI akzeptiert er es nicht. Wenn ich im Projektfile TargetFrameworks auf netcoreapp3.1 setze (das steht bei der Console App), kommen 55 Fehler im DLL Projekt, dass die Namen im aktuellen Kontext nicht vorhanden sind.

Wenn ich das BLE DLL Projekt mit dem

Im Bluetooth DLL Projekt gibt es auch Win32 und Windows als Platforms. Im BLE Projekt nur Windows. Dort gibt es noch eine Wasm Platform. Die scheint aber was mit Java zu sein. So scheint es für mich, dass es bei BLE keine Win32 Implementierung gibt (was ich ja immer wieder feststelle). Unter Windows Platform wird auch ganz normal Windows.Devices verwendet, was es ja nur bei UWP gibt. Win32 scheint also wirklich kein BLE zu unterstützen. In den Win32 Platform sourcen des Bluetooth Projekts sind die normalen Bluetooth Strukturen der Win API benutzt. Das hilft halt nur bei BLE nicht.

Ich habe übrigens nicht herausgefunden, warum die Exception geworfen wird. Und hinter dem eingefügten Link habe ich auch nichts entsprechendes gefunden.

27.07.2023 - 12:01 Uhr

32feet scheint ja doch alles zu haben, was ich brauche. Das wäre ja klasse.

Vielleicht bin ich jetzt ja ganz blöd.

Ich wollte das Beispiel 32feet/Samples/ConsoleBLETest at main · inthehand/32feet (github.com) hier laufen lassen. Also habe ich ein Konsolen-App Projekt erstellt. Also unter Projektvorlagen den Eintrag "Konsolen-App  Ein Projekt zum Erstellen einer Befehlszeilenanwendung, die mit .NET unter Windows, Linux und macOS ausgeführt werden kann" ausgewählt. Es gibt ja nur zwei Konsolen Vorlagen: diese und eine mit .NET Framework.

In dem Projekt habe ich dann das NuGet Paket InTheHand.BluetoothLE (4.0.33) installiert.

Unter Program.cs gibt es keine Main Funktion (finde ich ungewöhnlich, aber das haben die ja vielleicht so gemacht). Rufe ich dort 
bool allowed = await Bluetooth.GetAvailabilityAsync();
auf, bekomme ich false. Bei dem Beispiel steht auch, dass man eventuell eine Bluetooth Permission angeben muss. Wie das unter Windows funktioniert, steht dort aber nicht. Mir ist auch nicht bewusst, dass man dort eine Berechtigung vergeben kann bzw. muss. Die BLE UWP Testprogramme funktioniert ja auch auf dem Rechner.

Zuerst hatte ich die GetAvailability Abfrage nicht drin. Und ich habe Probleme mit dem async, await und task. Das habe ich bisher noch nie benötigt und bin da nicht sattelfest. Bei ScanForDevicesAsync bekomme ich eine Exception "Operation is not supported on this platform". Also funktioniert das doch nicht bei Windows?

Hier mal da aktuelle Program.cs:

// See https://aka.ms/new-console-template for more information

using InTheHand.Bluetooth;

bool allowed = false;

async Task<bool> TestDeviceDiscovery()
{
    Console.WriteLine("In DestDeviceDiscovery");
    return true;
    //var discoveredDevices = await Bluetooth.ScanForDevicesAsync();
    //Console.WriteLine($"found {discoveredDevices?.Count} devices");
    //return discoveredDevices?.Count > 0;
}

async Task<bool> TestAvailability()
{
    allowed = await Bluetooth.GetAvailabilityAsync();
    return allowed;
}

//bool allowed = await Bluetooth.GetAvailabilityAsync();
var availableTask = TestAvailability();
availableTask.Wait();
Console.WriteLine("allowed = " + allowed);

Console.WriteLine("Vor Funktionsaufruf");
var discoveredDevices = await Bluetooth.ScanForDevicesAsync();
Console.WriteLine("Nach Wait");
string line = Console.ReadLine();
27.07.2023 - 10:50 Uhr

Die Artikel hatte ich noch nicht gefunden. Sie haben mich doch recht optimistisch gestimmt. Dann kommt aber das große ABER.

Der Artikel ist schon etwas älter und benutzt nicht das aktuelle .Net. Im aktuellen .Net wurde das Einbinden von Windows.winmd aber untersagt (NETSDK1130: Direkter Verweis auf Windows Metadata-Komponente nicht möglich - .NET CLI | Microsoft Learn). Ich wurde dann auf microsoft/CsWinRT: C# language projection for the Windows Runtime (github.com) verwiesen. Gemäß meinem Verständnis kann man damit eine UWP Bibliothek erstellen, die man dann in eine .Net Bibliothek umwandelt. Mit Hilfe des NuGet Pakets.

Das funktioniert bei mir aber auch nicht. Ich bekomme immer den Fehler: Das Projekt <die UWP Library> ist nicht mit net7.0-windows10.0.22621 (.NETCoreApp, Version=7.0) kompatibel. Das Projekt unterstützt Folgendes: uap10.0.17763 (UAP, Version=v10.0.17763)

Anscheinend kann man doch keine Bibiliothek von UAP mit .NETCoreApp verbinden. In deren Beispiel CsWinRT/src/Samples/NetProjectionSample at master · microsoft/CsWinRT (github.com) haben die aber auch ein UAP Projekt, was nichts von Windows benutzt. Die haben einfach einen mathematischen Rechner, dier plus, minus, usw. macht. Und deren UAP Projekt ist in C++. Meine Library aber in C#. Ich dachte aber, das macht keinen Unterschied.

Das scheint wohl alles nicht zu funktionieren. Und die Windows.Devices Teile (sind ja wohl der low level Zugriff auf die HW), in denen das BLE drin ist, gibt es anscheinen wirklich nur für UWP. Ich habe auch nach Win32 API Funktionen für BLE gesucht. Die scheint es aber komischerweise nicht zu geben. Ich habe wohl Bluetooth API (den Link finde ich im Moment nicht) gefunden. Das ist aber was anderes als Bluetooth Low Energy.

Es wurde unten gesagt, ich könnte in Sourcen von Open Source Projekten nachschauen. Das war für NuGet Paket gemeint, oder? Es gibt aber doch nicht von allen NuGet Paketen den Source Code, oder? Da muss ich vielleicht noch mal wühlen.

Generell bin ich wohl nicht der Einzige, der über dieses Problem gestolpert ist. Man findet wohl Fragen, aber keine Antwort, wie das ohne UWO funktioniert. Das ist schon blöd. Vielleicht hat ja noch jemand einen Tip.

26.07.2023 - 09:58 Uhr

Ich möchte mit einem Windows Programm mit einem BLE Gerät kommunizieren.

Wenn ich das Internet richtig verstehe, gibt es das aber nur für Universal Windows Plattform (UWP). Hier für gibt es auch Beispiele, die auch bei mir funktionieren.

Ich würde aber lieber das "normale .Net", idealerweise mit Windows Forms (aber schon .Net Core und nicht .Net Framework), benutzen. Das funktioniert aber nicht? Selbst bei einer Suche nach einem Windows SDK hieß es, dass BLE nur bei UWP benutzt wird. Das kann doch gar nicht sein, oder? Es gibt wohl eine Bluetooth API im "normalen?" Windows SDK. Aber BLE ist doch was anderes, oder? Wenn ich per dll einige Windows Routinen einbinde, und die dann in meinem C# Programm benutze, wäre das auch ein Weg. Vielleicht nicht der einfachste, aber ...

Bei NuGet gibt es auch einige BLE Pakete. Aber da steht doch auch nie Windows dran. Oder interpretiere ich da was falsch?

Hat jemand schon mal BLE unter Windows gemacht?

Gruß
Erwin

28.06.2023 - 16:05 Uhr

Dann muss ich wohl noch mal lesen, wie das mit Rechten Anfordern ist.

Einen Tip?

28.06.2023 - 15:13 Uhr

Wir sind einen großen Schritt weiter.

Das mit dem Zertifikat installieren (wenn auch manuell) und das Installationspaket zu installieren funktioniert auch auf dem anderen Rechner.

Wenn das Programm dann das erste Mal mit Admin Rechten gestartet wird, funktioniert es auch. Danach funktioniert es auch ohne Admin Rechte.

Jetzt ist halt nur die Frage, wofür benötigt das Programm das erste Mal Admin Rechte? Ich benutze Preferences. Kann es sein, dass zum Erstellen der zugehörigen Datei Admin Rechte erforderlich sind? Zum schreiben/lesen später aber nicht mehr?

Ich müsste also mal eine Version ohne Preferences machen und diese dann auf einem frischen Rechner ausprobieren.

28.06.2023 - 13:44 Uhr

Ich habe es nun doch hinbekommen.

Beim Erstellen des Pakets in Visual Studio habe ich ein neues Zertifikat erzeugt und als vertrauensvoll eingestuft.

Danach habe ich dieses mit der Windows Zertikatsverwaltung in eine Datei exportiert. Die konnte ich dann auf dem anderen Rechner unter Local Machine und unter vertrauensvolle Person importieren. Damit lies sich dort dann auch das Programm installieren.

Danke für den Schups in diese Richtung.

28.06.2023 - 13:13 Uhr

Ich habe versucht, das Self CA auf einem anderen Rechner zu installieren. Das hat aber nicht funktioniert.

Genau genommen hat das Installieren schon funktioniert. Er hat es aber immer unter Local User installiert (zumindes  bei einem normalen doppelklick auf die erzeugt Schlüsseldatei). Ich muss es aber beim anderen Rechner doch unter Local Machine installieren und dann auch noch als Vertrauenswürdig einstufen.

Wie mache ich das denn?

28.06.2023 - 12:39 Uhr

Vielleicht noch ein Punkt. Ich würde ja wohl ein MSIX Package benutzen. Aber dafür braucht man ja ein Code-Signing Zertifikat, welches ich nicht habe. Und diese Zertifikate sind ja ganz so günstig.

Es gibt ja wohl keine Möglichkeit, das als MSIX Package zu erzeugen ohne ein Zertifikat zu haben, oder?

28.06.2023 - 12:30 Uhr

Wie in einigen Beiträgen zu lesen ist, bekommt man ein "wirkliches Exe", indem man commandNmae in launchSettings.json auf Project ändert und in einer PropertyGroup der Projekt Datei WindowsPackageType = None einfügt. Das funktioniert bei mir auch. Ich kann auf dem einen meiner Rechner so eine Exe machen. Die kopiere ich dann (zusammen mit den anderen Megabyte im Verzeichnis) auf den anderen Rechner und kann sie dort ausführen.

Halt nur nicht auf dem Rechne meines Kollegen. Bei einem zweiten Kollegen funktioniert es übrigens auch nicht. Ich schätze mal, das funktioniert auf allen anderen Rechnern nicht. Vielleicht nur auf denen, bei denen auch Visual Studio für MAUI installiert ist.

28.06.2023 - 11:22 Uhr

Ich habe eine MAUI App geschrieben, die beim Builden eine lauffähige Exe erstellt. Die läuft auch sowohl auf meinem Desktop als auch auf meinem Laptop. Nun habe ich die Exe (zusammen mit den 40MB anderen Dateien, die noch dabei liegen) auf den Rechner eines Kollegen kopiert.

Dort startet das Programm soweit, dass das Fenster korrekt angezeigt wird. Man kann aber nichts machen. Gemäß Task Manager werden auch 0% CPU Zeit benötigt.

Zuerst war wohl nicht das .Net Core 7 auf dem Rechner installiert. Das haben wir aber nachgeholt. In der Konsole werden nun unter dotnet --list-sdks und dotnet --list-runtime die Versionen (sogar die 7.08, wobei ich die 7.07 habe) angezeigt. Das hat auf mein Programm aber keinen Einfluss.

Dann habe ich gelesen, dass bei einigen das Installieren der WinUI 3 Gallery geholfen hätte. Beim Kollegen aber nicht. Auch ein installieren (bzw. update) des Windows App SDKs hat keine Änderung gebracht.

Naiv wie ich bin hätte ich erwartet, dass das Programm erst gar nicht startet, wenn kein passendes .Not Core installiert ist. Besser noch, dass es eine Fehlermeldung gibt, die darauf hinweist. Aber hier kommt nichts.

Wie finde ich denn nun heraus, was meinem Programm auf dem anderen Rechner fehlt? Ich kann ja auch schlecht debuggen um festzustellen, was das Programm überhaupt macht. Vielleicht habe ich ja auch was falsch gemacht. Da bin ich aber skeptisch; es läuft ja auf meinen beiden Rechnern.

Allerdings ist auf meinen beiden Rechner auch Visual Studio mit der MAUI Entwicklung installiert.

Irgendwelche Tipps?

28.06.2023 - 10:58 Uhr

Mit DesiredSize und dem SizeChanged Event klappt das sehr gut.

Für mich überraschend war nur, dass ich LayoutOptions beide auf Center stellen musste, damit das Item auch in dem Rechteck liegt, was ich übergeben habe. Also die linke obere Ecke ist auch dort, wo ich x und y des Rect eingegeben habe. Ich hatte erwartet, dieses Verhalten habe ich bei LayoutOptions Start.

Aber wie gesagt, es klappt nun.

22.06.2023 - 07:48 Uhr

Aber es gibt ja auch noch DesiredSize.

Wo steht denn wohl der Zusammenhang zwischen DesiredSize, Requested Size und aktueller Size erklärt? Und wann wird die Größe dann gesetzt?

22.06.2023 - 07:41 Uhr

Das habe ich alles gelesen.

Wenn man aber die Größe der Child Elemente kennt, und auch die eigene (also des Layouts), ist das doch gar nicht so schwer. Zumindest war es das bisher bei meiner Implementierung. Da ich aber auch wohl die Größe meiner Child Elemente ändern kann (ich übergebe ja ein Rect) gibt es vielleicht ein Henne und Ei Problem. Ich muss die (benötigte) Größe kennen,  um die (richtige) Größe berechnen zu können.

Ich werde mal weiter etwas herumspielen. Prinzipiell kann ich mich doch bei allen meinen Kindern auf SizeChanged Ereignisse registrieren und wenn ich dann die Größen aller meiner Kinder habe, kann ich sie ja positionieren.

21.06.2023 - 22:45 Uhr

Ich versuche die Positionierung von Elementen mit dem AbsoluteLayout zu verstehen.

Wo greift man am besten ein, um die untergeordneten Views (ich denke, dass sind ja alles Views) anzordnen?

Zum Testen habe ich eine Klasse von AbsoluteLayout vererbt, die als Content in meine ContentPage Klasse eingefügt wird.

Dann kann ich die OnSizeAllocated Funktion in meiner Layout Klasse überschreiben, in der ich mit den width und height Parametern schon mal den zur Verfügung stehenden Platz habe. In meinem Test habe ich erst einmal einfach BoxView Objekte erstellt. Bei denen habe ich die WidthRequest und HeightRequest Parameter gesetzt. Die kann ich in der OnSizeAllocated Funktion abfragen und die Boxen gewünscht positionieren. Die Width und Height Eigenschaften sind zu dieser Zeit noch nicht gesetzt.

Aber wenn ich mehr zusammengesetzte Strukturen in meiner Layout Klasse als Content habe, z.B. andere Layouts oder etwas in einer Border. Bei diesen Strukturen ist WidthRequest und HeightRequest nicht gesetzt. Ich habe also keine, zumindest gewünschte oder "normale", Größe meiner Child Objekte. Die benötige ich aber, um die Position der Childs zu setzen. Da das Setzen per Rect erfolgt, kann bzw. muss ich ja auch eine Breite und Höhe angeben, die mir ja fehlen.

Auch nach einigem Suchen im Netz habe ich nicht gefunden, wie das Layouten funktioniert. Es muss doch irgendwie so sein, dass erst einmal die Größe der Childs berechnet wird, die dann abgefragt werden kann, und womit die Childs dann angeordnet werden kann.

Kann mir da jemand helfen, das zu verstehen?

14.06.2023 - 10:25 Uhr

Was sind den Dev-Fehler?

Device Fehler? Developer Fehler?

Muss ich nun also damit leben?

14.06.2023 - 09:11 Uhr

Meine "normale" Applikation ist eine WinForms Applikation. Das gewisse Farben eines Styles, z.B. Button Farbe, bei den Technologien unterschiedlich sind und in Styles noch anders definiert sein können, ist mir schon klar.

Wenn ich aber doch per Hex-Wert oder per Color.FromRgb() eine Farbe fest auswähle, ist meine Erwartung, dass diese auf dem gleichen Rechner, und damit gleichen Bildschirm, auch gleich angezeigt wird. Das ist aber definitiv bei mir nicht der Fall. Gemäß meinem optischen Empfinden sind sie WinForms korrekt und bei MAUI "irgendwie dreckig".

Gibt es bei MAUI noch eine Art Farbenmanager, der meine eingestellte Farbe auf ein darzustellende Farbe konvertiert? Und das wäre bei mir nicht eins-zu-eins?

Der gegebene Farbwert entspricht der Anzeige des angehangenen Screenshots und ist kein Grau. Das mit dem Grau habe ich nur bemerkt, da mir das da als erstes aufgefallen ist.

14.06.2023 - 08:42 Uhr

Hallo,

wenn ich eine MAUI Applikation erstelle und die unter Windows (von Visual Studio gestartet) laufen lasse, sind die Farben anders. Sie sind irgendwie gräulich. Ich habe mal einen Screenshot angehangen. Im linken Bereich ist ein Border Element mit SolidColorBrush(Color.FromRgb(192, 225, 225)) angezeigt. Also von einer MAUI Applikation. Im rechten Bereich habe ich einen "normalen .Net Framework" Frame (also eine .Net Framework Applikation), dessen Hintergrund die gleiche Farbe hat (192, 225, 225). Der Unterschied ist schon gewaltig.

In meiner MAUI Applikation ist ein Grau auch nicht wirklich grau.

Hat jemand eine Ahnung, woran das liegt? Und vielleicht noch besser: wie bekomme ich die richtigen Farben in meine MAUI Applikation?

Gruß
Erwin

08.06.2023 - 22:28 Uhr

Ich bin gerade mit MAUI angefangen und finde es echt gut. Nun habe ich gelernt, dass man ja nur ein Installationspaket bekommt, mit dem man sein Programm dann unter Windows installiert. Die .exe Dateien, die unter dem bin Verzeichnis liegen, sind ja nicht richtig ausführbar. Zumindest passiert nichts, wenn man darauf klickt.

Nach dem Installieren ist mein Programm auch in Windows erhalten und ich kann es starten. Aber was wird da denn von wo gestartet? Das finde ich auch nach einigem Suchen im Netz nicht.

Bei meiner App gibt es unter Windows Start auch nicht das Untermenü "Dateispeicherort öffnen". Ich finde auch keine Exe Datei mit meinem Programm Namen. Mir scheint, es wird irgendein Script aufgerufen. Da bin ich aber nicht sicher.

Gemäß der Doku hätte ich auch erwartet, dass mein Programm bei jedem Neustart überprüft, ob es in dem Verzeichnis, welches ich ja beim Erstellen der Installationsdatei angeben musst, eine neue Version gibt, die dann direkt installiert wird. Bei meinem ersten Test hat das aber nicht funktioniert.

Gibt es für solche Details nicht auch irgendwo eine Dokumentation? Ich habe sie bisher halt nicht gefunden.

Vielen Dank für Tips
Erwin

07.06.2023 - 14:39 Uhr

Nachdem ich den Laptop komplett zurückgesetzt habe, also Windows neu gemacht habe, funktioniert es.

Trotzdem Danke für die Infos.

Das mit dem host x86 und x64 ist mir gar nicht aufgefallen. Vielleicht war das ja auch ein Fehlergrund. Nun ist beim Host x64 und als other architectures wird x86 angezeigt. Sieht also gut aus. dotnet wird auch aus dem x64 Verzeichnis genommen.

07.06.2023 - 12:39 Uhr

Ich stimme dir zu, dass da was nicht stimmt. Aber wie bekomme ich es korrigiert?

Ich habe gerade auf dem Laptop unter "Installierte Apps" alle .Net Sachen deinstalliert. Mit dem Visual Studio Installer habe ich auch alles deinstalliert. Dann habe ich den Rechner neu gestartet und mit dem Visual Studio Installer die Workloads .Net Multi-Platform App Entwicklung und .Net Desktopentwicklung neu installiert.

Danach gab es unter installierte Apps das Microsoft .NET SDK 7.0.302 (x64) from Visual Studio. Das ist aber nur 188kB groß, was mir sehr klein vorkommt. Auf dem Desktop (bei dem ja alles funktioniert), ist es aber auch nur so klein.

Gebe ich nun in einer Shell dotnet --info ein, bekomme ich auf dem Laptop

Host:
Version:      7.0.5
Architecture: x86
Commit:       8042d61b17

.NET SDKs installed:
No SDKs were found.

.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.16 [C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.5 [C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.11 [C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.16 [C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.5 [C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.11 [C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 6.0.16 [C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 7.0.5 [C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
x64   [C:\Program Files\dotnet]
registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x64\InstallLocation]

Environment variables:
Not set
global.json file:
Not found

Das sieht auf dem Desktop auch so aus, nur das dort keine 3.1.11 Versionen installiert sind.

Auf dem Desktop steht aber erst noch

.NET SDK:
Version:   7.0.302
Commit:    990cf98a27

Laufzeitumgebung:
OS Name:     Windows
OS Version:  10.0.22621
OS Platform: Windows
RID:         win10-x64
Base Path:   C:\Program Files\dotnet\sdk\7.0.302\

Wieso wird auf dem Laptop kein SDK gefunden? Sollte ich das ganze Betriebssystem auf dem Laptop noch einmal komplett neu aufsetzen?

Sonst wüste ich keinen Rat. Auf meinem Privatlaptop hat auch alles korrekt funktioniert. Nur auf diesem Arbeitslaptop nicht.

07.06.2023 - 09:31 Uhr

Damit kann ich Templates herunterladen. Das sind aber andere, als die auf meinem PC. Die Templates sind aber vielleicht sogar besser.

Ich habe aber mehr generelle Probleme. Wenn ich mit dem Template nun ein neues Projekt erstelle, läuft alles durch. Es wird mir im Projektmappen-Explorer aber kein Projekt angezeigt. Es steht dort auch 0 Projekte. Auf der Festplatte gibt es die Dateien aber. Möchte ich nun das vorhandene Projekt der Projektmappe hinzufügen, erscheint ein Fenster "Das angegebene SDK Microsoft.NET.Sdk wurde nicht gefunden.

Schaue ich im Laptop unter installierte Apps finde ich Microsoft.Net SDK 7.0.302 (x64) from Visual Studio. Also scheint doch was da zu sein.

Im Internet steht auch oft, man soll in einer Shell dotnet new --install ... aufrufen. Das funktioniert bei mir auch nicht. Er akzeptiert das new schon nicht. Da steht dann aber auch "No .NET SDKs foun".

Ich versuche nun mal, das SDK zu deinstallieren und neu zu installieren. Mal schaun, ob das was hilft.

07.06.2023 - 08:00 Uhr

Hallo,

ich habe ein sehr komische Phänomen. Ich habe eine Desktop PC mit Intel I5 Prozessor und 16GB Speicher und einen Laptop mit AMD Ryzon 7 Prozessor und 40GB Speicher. Auf beiden Rechnern läuft das gleiche Windows 11. Auf beiden Rechnern habe ich auch Visual Studio 2022 (neu, community Version) installiert. Beim Installations Assistenten von VS wird mir auch auf beiden Rechnern das gleiche angezeigt.

Nun möchte ich eine MAUI Applikation erstellen. Auf dem Desktop werden mir die MAUI Templates bei "Neues Projekt" auch angezeigt. Auf dem Laptop nicht.

Ich habe beim Laptop schon VS deinstalliert und neu installiert. Auch habe ich mich als Windows Benutzer auf dem Laptop entfernt und neu hinzugefügt. Das bringt aber alles nichts.

Ich bin mit meinem Latein echt am Ende. Hat jemand einen Tip, wie ich MAUI auch auf dem Laptop hinbekomme? Es liegt ja wohl nicht am Prozessor. Zumindest habe ich dafür keinen Hinweis im Netz gefunden.

Viele Grüße
Erwin

20.11.2021 - 23:26 Uhr

Wenn ich aus meiner dll ein nuget Paket erstelle, bekomme ich immer die Warnung

Fehlermeldung:
WARNUNG: NU5128: Some target frameworks declared in the dependencies group of the nuspec and the lib/ref folder do not have exact matches in the other location. Consult the list of actions below:

  • Add a dependency group for .NETFramework4.6 to the nuspec

So wild ist das nicht, es wird trotzdem ein korrektes Paket erstellt. Ich habe aber schon mehrfach versucht, diese dependency group einzufügen, war aber nicht erfolgreich.
Was muss ich tun, um diese Warnung weg zu bekommen?

Meine nuspec Datei sieht so aus:


<?xml version="1.0" encoding="utf-8"?>
<package >
  <metadata>
    <id>Helper</id>
    <title>Helper</title>
    <version>2.0.3</version>
    <description>Mehrere Hilfsklassen</description>
    <releaseNotes>Keine spezielle Release Information</releaseNotes>
    <authors>Ich</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <license type="expression">MIT</license>
    <copyright>$copyright$</copyright>
  </metadata>
</package>

Erzeugt wird das Paket mit:


nuget.exe pack -OutputDirectory D:\Packages -Prop Configuration=Release

was ich im Projekt Verzeichnis aufrufe.

Kann mir jemand helfen?
Erwin

20.11.2021 - 23:15 Uhr

Ich habe eine Checkbox in einen ToolStripControlHost eingebaut:


    public class CheckboxStripItem : ToolStripControlHost
    {
        private CheckBox checkBox;

        public CheckboxStripItem()
            : base(new CheckBox())
        {
            checkBox = Control as CheckBox;
        }

        public bool Checked
        {
            get { return checkBox.Checked; }
            set { checkBox.Checked = value; }
        }

Das funktioniert soweit gut. Im Projekt Explorer wird die Klasse nicht als "normale C#" Klasse dargestellt, sondern als "andere Komponente" (siehe Scrennshot.png).
Nach einem Doppelklick auf die .cs Datei (also der obere Teil des Screenshots), kommt die Fehlermeldung des Designers > Fehlermeldung:

"Um mögliche Datenverluste zu verhindern, müssen vor dem Laden des Designers folgende Fehler behoben werden:"

. Als Fehler wird angezeigt > Fehlermeldung:

"Der Konstruktor für den Typ "System.Windows.Forms.ToolStripControlHost" wurde nicht gefunden.".

Beim Compilieren gibt es keine Probleme und das CheckboxStripItem kann ich auch in Menüs einfügen. Aber die Fehlermeldung ist doch nicht richtig?
Bei einem Klick auf die Klasse selber, unterhalb der Datei (im Projekt Explorer) wird der Source Code angezeigt und ich kann ihn auch editieren.

Wieso bekomme ich die Fehlermeldung und kann die Datei nicht "normal" editieren?

Gruß
Erwin

19.04.2021 - 21:13 Uhr

War ja nur so ein Gedanke von mir.
Werde es doch wieder so machen, wie bisher mit Standard Mitteln.
Trotzdem danke für die Bemerkungen.

18.04.2021 - 22:59 Uhr

Ich habe eigene UserControl, die in einer DLL liegen, die als NuGet Pakete der Applikation zugeordnet sind.
Nun kann ich der Toolbox sagen, sie soll auch Controls aus dieser DLL anzeigen. Dann finde ich auch mein UserControl. Allerdings habe ich das dann ja immer in der Toolbox.

Klasse wäre es, wenn meine UserControl nur in der Toolbox erscheinen würde, wenn die DLL als Verweis meinem Projekt zugelinkt ist. Gibt es da irgendeine Möglichkeit? Controls von anderen Projekten, die ich in meine Solution einbinde, werden ja auch automatisch in der Toolbox angezeigt.

18.04.2021 - 22:51 Uhr

Hallo,

ich habe mir ein Fenster erstellt, in dem ich eigene spezielle Debug oder Trace Ausgaben ausgebe. Das klappt auch sehr gut. Nur habe ich einen Fall übersehen, in den ich gerade gelaufen bin:
Wenn ich Informationen von einem Fenster erzeuge, was Modal bzw. als Dialog angezeigt wird, erscheinen die Daten wohl in meinem Debug Fenster, aber ich kann das Fenster dann ja nicht aktivieren, um dort z.B. zu scrollen.

Prinzipiell soll das ja auch nicht funktionieren: wenn ich ein Fenster als Dialog anzeige, soll ein anderes Fenster ja auch gesperrt sein. Aber kennt jemand vielleicht einen Trick, wie ich das doch hinbekomme? Die Sachen in einen anderen Thread auszulagern, hilft sicher nicht. Vielleicht müsste es ein ganz anderer Prozess sein, der dann aber nicht auf meine Daten zugreifen kann.

Prinzipiell habe ich eine Lösung, indem ich die Anzeige in einem extra Programm (also eine extra C# Solution) implementiere. Allerdings muss ich dann mit shared Memory (oder eine andere Art von IPC) Arbeiten, damit die Daten in das andere Programm kommt.
Alles in einem Prozess ohne shared Memory ist schon schön und funktioniert auch, solange ich kein Dialog Fenster anzeige.

Gruß
Erwin

11.04.2021 - 18:28 Uhr

Nach einigem Lesen komme ich nun zu dem Schluss, dass $Version$ in .nuspec doch nicht das gleiche wie die Assembly Version ist.
Das passt ja auch von der Anzahl der Nummern nicht: Assembly Version benutzt 4 Zahlen, nuget 3. Also sind die beiden Versionen doch wohl unterschiedlich bzw. ich sollte sie manuell gleich halten. Obwohl die nuget Version ja vielleicht wichtiger als die Assembly Version ist. Vielleicht doch nur eine gleich halten?

11.04.2021 - 18:03 Uhr

Zuerst einmal Danke für die schnelle Antwort und Sorry, dass ich jetzt erst reagiere.
Das mit dem nuget ist sicherlich der richtige Weg und ich habe auch schon vom meiner dll ein nuget Paket in meinem lokalen nuget Verzeichnis erstellt. Allerdings stelle ich jetzt fest, dass das Paket immer die Version 1.0.0 bekommt, obwohl in meinem Assembly Info was anderes steht:
[assembly: AssemblyVersion("1.1.466.1059")]
In meiner .nuspec Datei steht
<version>$version$</version>
Damit sollte er doch die Version aus dem Assembly nehmen. In der Ausgabe von nuget.exe pack wird hinter "Paketerstellung aus Dateien aus" auch das richtige Verzeichnis angezeigt. Es wird auch der richtige .nuspec Dateiname als "wird für Metadaten verwenden". Sieht also alles gut aus.
Trotzdem wird immer das Paket 1.0.0.nupkg erstellt.
Ich suche schon eine Weile im Netz, finde aber nichts, was den Fehler erklärt (zumindest bisher noch nicht).

nuget gibt mit aber noch folgendes aus:
WARNUNG: NU5128: Some target frameworks declared in the dependencies group of the nuspec and the lib/ref folder do not have exact matches in the other location. Consult the list of actions below:

  • Add a dependency group for .NETFramework4.7 to the nuspec

Ich habe noch nicht verstanden, wie ich diese dependency group einfüge (muss doch in der .nuspec Datei eingetragen werden), damit diese Warnung nicht mehr kommt.
Kann diese Warnung eventuell dazu führen, dass er immer die falsche Version benutzt?

Gruß
Erwin

02.04.2021 - 22:56 Uhr

Hallo,
wenn ich ein dll Projekt erstelle, kann ich es ja als debug und auch als release erstellen. Bei release wird ja auch optimiert und es gibt einmal Dateien in debug und einmal im release Verzeichnis. Wenn ich diese dll nun von einem anderen Projekt benutzen möchte, binde ich sie ja als Verweis ein. Wenn ich mein Projekt als debug erstelle, muss ich auch die debug Version der dll einbinden. Wenn ich die release Version einbinde, gibt es (zumindest bei mir) Probleme.

Prinzipiell müsste es doch so sein, dass ich auf die debug Version der dll verweise, wenn ich als debug builde und auf die release Version, wenn ich als release builde. Aber die Verweise sind doch von der Konfiguration unabhängig?

Wie macht man so etwas denn? Oder geht das gar nicht? Das wäre aber blöd.