Laden...
Y
Benutzerbeschreibung

Forenbeiträge von Yeats Ingesamt 102 Beiträge

30.11.2022 - 13:42 Uhr

Danke @Abt

Die jeweilige Distro ist dafür verantwortlich, welche Version sie reinnehmen, wann sie aktualisieren und releasen - nicht Microsoft.

Das ist mir bewusst.

Distros übernehmen jedoch meistens nur LTS Releases, was .NET 7 jedoch nicht ist. In .NET (wie auch bei Node...) sind immer gerade Zahlen LTS Releases.

Ahh, verstehe.

Danke für die Info.

Grüße

30.11.2022 - 08:37 Uhr

Guten Morgen,

Ist das Net7 SDK schon in den jeweiligen Linux Repositories verfügbar? Bis jetzt sehe ich nur die SDK's für 6.0. Oder gibt es eine Seite, wo man den Status dazu sieht?

Grüße

23.09.2022 - 12:25 Uhr

Danke für die Antwort Abt.

Ich hatte eine solche Antwort erwartet. Danke für die Bestätigung!

23.09.2022 - 12:07 Uhr

Danke für die Antwort T-Virus.

Momentan arbeite ich auch mit JToken, JObject, JArray. Aber damit allokiere ich zu viel Speicher.

Die Struktur unterscheidet sich in einigen Properties/neue Klassen.

Zwar wäre es für mich möglich, die Klassenhierarchie dementsprechend anzupassen, aber Anpassungen müssten dann immer übernommen werden und ich verliere die Resilienz, die ich aktuell habe.

23.09.2022 - 11:30 Uhr

Verwendetes Datenbanksystem: json

Hallo

Arbeite an einem Unity3D Projekt, welches nach WebGL übersetzt wird, und einen Produktkatalog abbilden soll.

Das Projekt empfängt einen JSON-String (~4MB) der deserialisiert werden muss, um die interne Datenstruktur aufbauen zu können.
Dieser JSON-String besteht dabei aus einem Teil, der von mir kontrolliert wird und aus einem Teil, der von anderen Web-API's befüllt wird.

Die Deserialisierung erfolgt momentan über selbstgeschriebene Klassen, die von JsonConvert erben, da ich damit große Teile des JSON-Strings nicht verarbeiten muss --> hilft mir auch damit, dass ich Änderungen im Teil, die für die interne Struktur irrelevant sind, nicht übernehmen muss.

Aktuell läuft das auch sehr gut und zeigte sich auch gegenüber Änderungen resilient.

Das Problem ist, dass ich damit im Browser einen großen Teil des Heap belaste. Wenn der JSON-String anwächst (≥10MB) bekomme ich damit ein Problem, dass ich nun über den für Unity zugewiesenen Speicherbereich komme und der Unity-Kontext abstürzt.

Auch habe ich die Komponente, die für die Deserialisierung zuständig ist, in einem eigenen nuget in Unity eingebunden. Dieses Nuget-Paket hat eine Abhängigkeit zu Newtonsoft.Json v. 13.0.1.

Jetzt wollte ich diesen Teil überarbeiten, habe mir für die Json-Struktur eine entsprechende Klassenhierarchie geschrieben und über JsonConvert.DeserializeObject auch de-serialisieren können.
Die Benchmarks haben dafür auch einen deutlichen Vorteil gezeigt:

Method Mean Error StdDev Gen0 Gen1 Allocated
Convert_First 43.47 ms 0.505 ms 0.448 ms 250.0000 83.3333 26.54 MB
Convert_Second 45.25 ms 0.491 ms 0.435 ms - - 5.82 MB

Wobei Convert_First der selbstgeschriebene Ansatz war und Convert_Second über JsonConvert.DeserializeObject.

Allerdings stehe ich jetzt vor dem Problem, dass die letzte Version der API, über die der JSON-String kommt, die Struktur etwas geändert hat (im Teil, der nicht in meiner Kontrolle liegt).
Zwar wäre es für mich möglich, die Klassenhierarchie dementsprechend anzupassen, aber Anpassungen müssten dann immer übernommen werden und ich verliere die Resilienz, die ich aktuell habe.

Die Interfaces, die benutzt werden für den Aufbau des JSON-Strings, sind hierbei in TypeScript geschrieben.

Welchen Ansatz könnte ich nun verfolgen, um einerseits die jetzige Flexibilität beizubehalten, aber gleichzeitig den allokierten Speicher gering zu halten?

Grüße,
Yeats

25.01.2021 - 08:58 Uhr

Hallo,

Seit ca. 1 Monat bekomme ich häufig beim Start von Visual Studio 2019 Community Edition (Version 16.8.4) folgende Fehlermeldung:

Fehlermeldung:
StreamJsonRpc.ConnectionLostException : The JSON-RPC connection with the remote party was lost before the request could complete.
at async StreamJsonRpc.JsonRpc.InvokeCoreAsync(<Unknown Parameters>)
at async StreamJsonRpc.JsonRpc.InvokeCoreAsync[TResult](<Unknown Parameters>)
at async Microsoft.CodeAnalysis.Remote.RemoteEndPoint.InvokeAsync[T](<Unknown Parameters>)
at Microsoft.VisualStudio.Telemetry.WindowsErrorReporting.WatsonReport.GetClrWatsonExceptionInfo(Exception exceptionObject)

Ich hatte schon versucht, Erweiterungen zu deaktivieren und zu deinstallieren, Visual Studio mehrmals neu installiert.

Auf github gibt es dazu zwar schon einen Eintrag: github. Allerdings bin ich mir nicht sicher in welchem "nächsten" Release das behandelt wird, da es schon im April letztes Jahr berichtet wurde und in dem letzten Release von Januar dieses Jahres hat es auf alle Fälle nicht behoben.

Das Problem ist, sobald dieser Fehler kommt, werden Klassen nicht mehr erkannt und ein einfaches Navigieren zu diesen ist nicht mehr möglich. Die "Error List" aktualisiert sich nicht mehr.

Hat jemand eine Idee wie man diesen Fehler umgehen kann?
Mit freundlichen Grüßen

12.11.2020 - 19:15 Uhr

Hallo,

Mittels IronPython kannst du dir in einem C# Programm eine Python ScriptEngine erstellen wo du dann entweder ein Python Skript, oder ein Python File von einem Ordner laden könntest.

Sowas könnte so aussehen:


using System;

using IronPython.Hosting;


namespace Test
{
    public class Program
    {
        public static void Main (string[] args)
        {
            //var engine = Python.CreateEngine();
            //var scope = engine.ExecuteFile("hello.py");

            var engine = Python.CreateEngine();
            engine.Execute("print \"Hello World from Python\"");
            
            Console.ReadKey();
        }
    }
}

Ob du damit ein Python 3.* ansprechen kannst, weiß ich allerdings nicht.

Ansonsten natürlich auch die Ausführung über CLI wie Taipi88 schon beschrieben hat.

21.03.2019 - 13:10 Uhr

Bower muss installiert werden.

npm install -g bower

Allerdings, dass weiß vielleicht jemand anderes besser, wird Bower selten verwendet.

17.01.2019 - 11:41 Uhr

Hallo zusammen,

Ich arbeite an einer ASP Core 2.1 Solution wo mehrere Projekte inkludiert sind. Von Zeit zu Zeit möchte ich dann die nuget Pakete aktualisieren. Allerdings ist das jedesmal eine frustrierende Angelegenheit.
Manche Pakete lassen sich ohne weiteres updaten, andere produzieren einen Fehler und weitere Versuche ein Update durchzuführen schlagen fehl.
Mein Ansatz ist dann immer, die Änderungen zurück zu setzen und dann die Pakete in einer anderen Reihenfolge zu aktualisieren.

Deshalb nun meine Frage, wie macht ihr das bei euch?

Mfg

12.07.2018 - 15:26 Uhr

Wenn du mit WPF arbeitest, sieh dir auch das MVVM Pattern und versuche dich daran zu halten. Es macht einiges einfacher --> Bessere Trennung deiner Logik von deiner UI --> leichteres schreiben von UnitTests

11.07.2018 - 09:22 Uhr

Darstellung von Messwerten der Wetterstation und Heizung sollte kein Problem sein. Falls du asp.net core benutzen möchtest, musst du halt schauen, ob die dll benutzbar ist. Die Frage ist, wie detailiert und genau eine Visualisierung deiner Beleuchtung machen möchtest 3D Darstellung? Schematische Darstellung? Generell solltest du aber genügend Möglichkeiten finden, dir eine Visualisierung zu basteln.

Da du aber eine Trennung des Frontends vom deiner Logik und Backends angedacht hast, sollte es im ersten Schritt egal sein, ob dein Frontend Vue.js/Angular/... oder eine Konsolenanwendung ist.

27.06.2018 - 16:25 Uhr

Roslyn wird von VS benutzt. Darüber hinaus kann Roslyn auch außerhalb von VS benutzt werden. Roslyn Analyzer sind Erweiterungen die man für den Compiler schreiben kann um zB. eigene Code Inspections machen zu können die man dann wieder in VS einsetzen kann. Ein Beispiel wäre hier

26.06.2018 - 08:19 Uhr

Hallo,
Sieh dir in diesem Zusammenhang mal OmniSharp an. Das wird auch verwendet im C# Plugin für Visual Studio Code. Der Source findet sich auf GitHub und baut auf dem Roslyn Compiler auf.

11.06.2018 - 16:38 Uhr

Hallo,
Stimmen die Namen deiner Properties mit den Namen der Spalten in der Tabelle überein?

14.05.2018 - 11:12 Uhr

Hallo,

Wie setzt du die Referenz auf den Modul-Typ?

Grüße

07.05.2018 - 15:57 Uhr

Ah, ja so betrachtet macht es natürlich Sinn.

07.05.2018 - 13:57 Uhr

Hallo,

Ich hab ein Verständisproblem mit dynamic.
Folgende Method:


public object Cast(dynamic dynObj){
return (object)dynObj;
}

Diese Methode wird mit einem dynamic object aufgerufen.


public class Test : DynamicObject{xxx}

Test test = new Test();
dynamic obj = (dynamic)test;

var x = Test(obj);

Soweit ist auch alles in Ordnung. Was mich allerdings wundert, wenn der Kompiler den Typen selbst erkennt, dann ist für ihn x vom Typ dynamic.

Wenn ich den Aufruf so gestalte, dann ist x vom Typ object.


object x = Test(obj);

Meine Frage ist jetzt eigentlich nur, warum wird bei impliziter Konvertierung der Typ auf dynamic gecastet?

Grüße

23.03.2018 - 16:26 Uhr

Sieh dir dazu Omnisharp und das LanguageServerProtocol von Microsoft an.

Omnisharp

LanguageServerProtocol

07.01.2018 - 17:12 Uhr

Danke Abt,
Danke Th69

Der Pfad zu MSBuild war falsch konfiguriert.

07.01.2018 - 16:33 Uhr

Habe die ToolsVersion auf 15 geändert.
Damit bekomme ich diese Meldung.> Fehlermeldung:

This toolset may be unknown or missing, in which case you may be able to resolve this by installing the appropriate version of MSBuild, or the build may have been forced to a particular ToolsVersion for policy reasons. Treating the project as if it had ToolsVersion="4.0".

Auf dem Rechner ist allerdings Visual Studio 2017 Community installiert.

07.01.2018 - 15:48 Uhr

Hallo,

Zur Zeit versuche ich mir Jenkins zu konfigurieren. Dazu habe ich das MSBuild Plugin installiert. Anschließend mit dem Git-Repository verbunden und ein Projekt angelegt.
Ohne die Ausführung der UnitTests, nur als BuildServer, hat es problemlos geklappt.
Anschließend wollte ich noch die UnitTests ausführen lassen. Dazu NUnit auf dem Rechner installiert, NUnit Plugin installiert, den MSBuild Pfad in Jenkins angegeben und anschließend beides zusammen im Build Prozess angegeben.

Allerdings bekomme ich nun beim Kompilieren Fehler durch MSBuild die ich beim Kompilieren mit Visual Studio oder Rider nicht bekomme.

Das Projekt baut auf Framework 4.7 auf.

Folgend ist ein Auszug aus dem Jenkins Output.


C:\Jenkins\Workspace\Continuity>C:\temp\nuget.exe restore 
MSBuild auto-detection: using msbuild version '15.5.180.51428' from 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\bin'.
Restoring NuGet....

C:\Jenkins\Workspace\Continuity>exit 0 
Path To MSBuild.exe: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe
Executing the command cmd.exe /C " chcp 1252 & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe Continuity.sln " && exit %%ERRORLEVEL%% from C:\Jenkins\Workspace\Continuity
[Continuity] $ cmd.exe /C " chcp 1252 & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe Continuity.sln " && exit %%ERRORLEVEL%%
Active code page: 1252
Microsoft (R) Build Engine version 4.7.2558.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
Build started 07.01.2018 13:36:09.
Project "C:\Jenkins\Workspace\Continuity\Continuity.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
  Building solution configuration "Debug|Any CPU".
Project "C:\Jenkins\Workspace\Continuity\Continuity.sln" (1) is building "C:\Jenkins\Workspace\Continuity\Continuity\Continuity.csproj" (2) on node 1 (default targets).
Project file contains ToolsVersion="12.0". This toolset may be unknown or missing, in which case you may be able to resolve this by installing the appropriate version of MSBuild, or the build may have been forced to a particular ToolsVersion for policy reasons. Treating the project as if it had ToolsVersion="4.0". For more information, please see http://go.microsoft.com/fwlink/?LinkId=291333.
PrepareForBuild:
  Creating directory "bin\Debug\".
  Creating directory "obj\Debug\".
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3267: The primary reference "System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL", which is a framework assembly, could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.7". To resolve this problem, either remove the reference "System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" or retarget your application to a framework version which contains "System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL". [C:\Jenkins\Workspace\Continuity\Continuity\Continuity.csproj]
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3257: The primary reference "System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" could not be resolved because it has a higher version "4.1.2.0" than exists in the current target framework. The version found in the current target framework is "4.0.0.0". [C:\Jenkins\Workspace\Continuity\Continuity\Continuity.csproj]
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3267: The primary reference "System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL", which is a framework assembly, could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.7". To resolve this problem, either remove the reference "System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" or retarget your application to a framework version which contains "System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL". [C:\Jenkins\Workspace\Continuity\Continuity\Continuity.csproj]
GenerateTargetFrameworkMonikerAttribute:
...

BaseClasses\SlExcelStatus.cs(7,29): error CS1002: ; expected [C:\Jenkins\Workspace\Continuity\Continuity\Continuity.csproj]

Hat jemand da eine Idee dazu?
mfg

30.11.2017 - 14:30 Uhr

Danke für die Antwort!
Die Beschreibung des Strict Modes ist aber auch recht niedlich.

30.11.2017 - 13:54 Uhr

Danke felix für den Hinweis.

Aber bitte den letzten Absatz lesen. Ich ERWARTE mir einen Fehler, bekomme aber nur eine Warnung!

Die Warnung lautet hierbei auch nur:
Field 'Value' doesn't have a default value!

Würde mir an dieser Stelle nun eigentlich einen Fehler erwarten!

30.11.2017 - 13:49 Uhr

verwendetes Datenbanksystem: mariadb 10.2
HeidiSql 9.4.0.5125

Hallo,

Habe eine Tabelle


CREATE TABLE `Options` (
	`Id` INT(11) NOT NULL AUTO_INCREMENT,
	`Code` VARCHAR(200) NOT NULL COLLATE 'utf8_general_ci',
	`Value` VARCHAR(10000) NOT NULL COLLATE 'utf8_general_ci',.........

Value ist, wie man sehen kann, auf not null gesetzt.
Allerdings führt folgendes Insert Statement nur zu einer Warnung:


INSERT INTO `Options` (`Code`, `VariantId`) VALUES ('XFSA', 8);

Die Warnung lautet hierbei auch nur:> Fehlermeldung:

Field 'Value' doesn't have a default value!

Würde mir an dieser Stelle nun eigentlich einen Fehler erwarten!

Kennt jemand den Grund für ein solches Verhalten?
Grüße, Yeats

11.09.2017 - 16:37 Uhr

@Abt: Danke für den Hinweis. Dann werde ich mal schauen wie das zu konfigurieren ist.

11.09.2017 - 16:25 Uhr

Die Spaces hab ich hinzugefügt, damit ++nicht ++in eine URL umgewandelt wird.

08.09.2017 - 10:35 Uhr

Hallo,

Bin am herumprobieren der Rider IDE und versuche mich daran mein Projekt zu debuggen.
Das Projekt ist ein .netcore 1.1, mit JS und Angular. Das bearbeiten und kompilieren funktionieren problemlos. Allerdings bekomme ich es nicht hin, den Source zu Debuggen.
Aus Rider heraus habe ich aber kein Problem den Server zu starten und mich zu verbinden.

Ich schätze mal, dass meine Argumente die ich mitgebe nicht korrekt aufgesetzt sind.
Hierzu meine Arguments:

/site:{ProjectName} /apppool:Clr4IntegratedAppPool
Environmental Variables: ASPNETCORE_ENVIRONMENT: Development
ASPNETCORE_URLS: http://localhost:5000

Was ich, neben dem Debugger, noch gerne hätte, dass beim Starten Chrome gestartet wird.

Hat jemand schon Erfahrung gesammelt, oder kennt hilfreiche Links?

Grüße

09.06.2017 - 15:24 Uhr

Wenn ich mir das SQL Statement hole und in der DB absetze, kann ich ohne weiteres hinzufügen.

In der Where Bedingung steht


WHERE ROW_COUNT() = 1
 AND `Id`=LAST_INSERT_ID()

09.06.2017 - 14:15 Uhr

Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.

09.06.2017 - 13:59 Uhr

Hallo,

Habe eine Frage zu .net core und MySql.Data.EntityFrameworkCore(last stable)
Verwendete
Habe im Prinzip zwei POCO Klassen:


public class A:BaseObject
{
public AGroup Group{get;set;}
}

public class AGroup:BaseObject
{
public ICollection<A> A{get;set;}
public AGroup(){
A=new List<A>();}
}

Diese sind in einer Mapping Klasse auf Ihre jeweiligen die Datenbanktabellen gemappt.

Wenn ich nun in einem Test versuche von AGroup ein Objekt zu schreiben, bekomme ich eine DbUpdateConcurrancyException.

Dazu der Test:


[FACT]
public void CreateTest(){
using(var ctx = new DbContext())
{
var group = new AGroup();
group.Add(new A{...});

Db.AGroups.Add(group);
Db.SaveChanges();
}
}

Suche jetzt schon eine geraume Zeit nach dem Grund. Was ich auf alle Fälle ausschließen kann, es gibt auf der DB keinen Eintrag der identisch wäre. Außerdem ist in keiner verwendeten Klasse ein ConcurrencyToken angegeben. Das Objekt ändert sich zwischen hinzufügen und Speichern nicht. Außerdem konnte ich auch ForeignKey Exceptions ausschließen.

Hat von euch vielleicht jemand diesen Fall schon gehabt und einen Grund dafür gefunden?

15.04.2017 - 14:08 Uhr

Hallo MrSparkle,

Wenn ein Item schon angelegt habe und es zum Editieren in das Control lade, dann wird die Combobox nicht mit dem Wert zuvor gespeicherten Wert befüllt.

In der Ausgabe war keine Fehlermeldung durch das DataBinding zu finden.
Die Idee mit einem Converter das Binding zu untersuchen, muss ich ausprobieren.

12.04.2017 - 13:04 Uhr

Hallo,

Habe ein UserControl gebaut.


<UserControl ... >
    <Grid x:Name="ElementRoot" DataContext="{Binding ElementName=ParentElement}">
...
<ComboBox x:Name="CountryComboBox"
                  Grid.Row="3"
                  Grid.Column="1"
                  Margin="4"
                  DisplayMemberPath="Name"
                  ItemsSource="{Binding CountryList,
                                        Mode=TwoWay}"
                  SelectedItem="{Binding SelectedItem}" />
...
    </Grid>
</UserControl>

Code behind mit den Dependency Properties


public partial class AddressControl : UserControl
    {
        public AddressControl()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty StreetProperty = DependencyProperty.Register(
            "Street", typeof(string), typeof(AddressControl), new PropertyMetadata(default(string)));

        public string Street
        {
            get { return (string)GetValue(StreetProperty); }
            set { SetValue(StreetProperty, value); }
        }

        public static readonly DependencyProperty CityProperty = DependencyProperty.Register(
            "City", typeof(string), typeof(AddressControl), new PropertyMetadata(default(string)));

        public string City
        {
            get { return (string)GetValue(CityProperty); }
            set { SetValue(CityProperty, value); }
        }

        public static readonly DependencyProperty ZipCodeProperty = DependencyProperty.Register(
            "ZipCode", typeof(string), typeof(AddressControl), new PropertyMetadata(default(string)));

        public string ZipCode
        {
            get { return (string)GetValue(ZipCodeProperty); }
            set { SetValue(ZipCodeProperty, value); }
        }

        public static readonly DependencyProperty CountryListProperty = DependencyProperty.Register(
            "CountryList", typeof(ObservableCollection<Country>), typeof(AddressControl),
            new PropertyMetadata(default(ObservableCollection<Country>)));

        public ObservableCollection<Country> CountryList
        {
            get { return (ObservableCollection<Country>)GetValue(CountryListProperty); }
            set { SetValue(CountryListProperty, value); }
        }

        public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
            "SelectedItem", typeof(Country), typeof(AddressControl), new PropertyMetadata(default(Country)));

        public Country SelectedItem
        {
            get { return (Country)GetValue(SelectedItemProperty); }
            set { SetValue(SelectedItemProperty, value); }
        }
    }

Die ItemsSource der Combobox wird an eine Liste mit Countries gebunden. Das UC funktioniert soweit, dass ich die Liste bekomme, anzeigen kann, auswählen kann, und das Model auf das zugegriffen wird, die Werte auch wieder gesetzt bekommt.

Das UserControl wird folgend verwendet:


<StackPanel Orientation="Vertical">
                <controls:AddressControl City="{Binding City,
                                                        Mode=TwoWay}"
                                         CountryList="{Binding Countries,
                                                               Mode=TwoWay}"
                                         SelectedItem="{Binding Country,
                                                                Mode=TwoWay}"
                                         Street="{Binding Street,
                                                          Mode=TwoWay,
                                                          ValidatesOnDataErrors=True}"
                                         ZipCode="{Binding ZipCode,
                                                           Mode=TwoWay,
                                                           ValidatesOnDataErrors=True}" />

Wenn ich nun ein Address item mit gefüllten Werten dem UC zum Binden gebe, werden auch alle Daten, außer der Combobox, korrekt angezeigt und können geändert und gespeichert werden.
Allerdings zeigt die Combobox den Wert nicht an.
Versuchsweise wurde auch das SelectedValue der Combobox an das SelectedItem Property gebunden. Brachte allerdings auch nicht den erwünschten Effekt.

Hat jemand eine Idee was ich hier falsch mache?

Grüße

12.10.2016 - 14:08 Uhr

Hallo,

Absolut zeitgleich wird nicht funktionieren da das umbenennen immer ein paar ms dauern wird.

Aber du kannst dir die Inhalte (Dateien) der Ordner auslesen. Somit bekommst du die Pfade zu den Dateien.

Sieh dir dazu die Klasse DirectoryInfo an.

05.07.2016 - 12:33 Uhr

Hallo Th69,

Dies aber nur solange die DLL im GAC oder im selben Programm Verzeichnis liegt.

05.07.2016 - 10:23 Uhr

@Abt:
Danke für den Hinweis.
Soweit mir bekannt kann sizeof nur die Größe von Valuetypes ermitteln. Da die Klasse oder von mir aus auch das struct XCSymbolDesc aber zwei string Fields beinhaltet, kann doch sizeof nicht mehr verwendet werden, oder täusche ich mich?

05.07.2016 - 09:46 Uhr

Hallo,

Bezieh mich hier auf ein Projekt an dem ich gerade arbeite.

Ich beziehe mich auf XC_Comm.dll. Diese Dll liegt in einem Ordner. Zuerst rufe ich die Methode SetDllDirectory auf und gib den relativen Pfad an in dem die Dll liegt.
Anschließend rufe ich die Methode LoadLibrary auf, bei dieser gebe ich den Namen der dll an.

Momentan ist das ganze noch ein Prototyp und nicht nach MVVM gebaut. Somit liegt mein Code noch im Code-Behind-File der Wpf Anwendung.

MainWindow.xaml.cs:


public void SetAndLoadDll()
{
if (!NativeMethods.SetDllDirectory(@"..\..\..\DLL"))
return;
var handler = NativeMethods.LoadLibrary("XC_Comm.dll");
}

handler sollte beim Schließen benutzt werden um die dll wieder frei zu geben(FreeLibrary).

Grüße

05.07.2016 - 09:28 Uhr

Hallo,

Danke für deine Antwort!

Die Anzahl ist mir bekannt. Heißt das ich sollte das so schreiben können:


var list = new List<XCSymbolDesc>();

for (int index = 0; index < countSymbols; index++)
{
var pointer = info.ppSymbolList + Marshal.SizeOf<XCSymbolDesc>() * index;
list.Add(Marshal.PtrToStructure<XCSymbolDesc>(pointer));
}

Wobei hier ppSymbolList laut Api so in C++ definiert ist: XCSymbolDesc **ppSymbolList.

Mein Problem hierbei, sobald index = 1 bekomme ich eine "AccessViolationException: Attepmted to read or write protected memory."

Das nächste Problem ist, dass das erste Objekt das ich raus bekomme, die Daten falsch sind. Die Werte passen nicht mit dem zusammen was ich aus einer funktionierenden C++ Anwendung heraus bekomme.

Grüße

04.07.2016 - 15:39 Uhr

Was möchtest du wissen?

01.07.2016 - 11:11 Uhr

public static class NativeMethods
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr LoadLibrary(string dllToLoad);

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

        [DllImport("kernel32.dll")]
        public static extern bool FreeLibrary(IntPtr hModule);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetDllDirectory(string lpPathName);
    }

Damit kann man eine Dll in den Speicher laden und verwenden.
Das kann dann so verwendet werden:


SetDllDirectory(@"..\..\..\DLL");
LoadLibrary("Toolbox.dll");


[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void DLL_Func(string logFunc);

Mfg

30.06.2016 - 10:10 Uhr

Erstmal, Danke weismat.

Habe noch eine Verständnisfrage.

Pointer of Pointer bedeutet ja so viel wie:
Es gibt einen Speicherbereich. Auf diesen Speicher zeigt ein Pointer. Der Speicherbereich dieses Pointers wird dann nochmals referenziert.

Wenn dies nun in einer IntPtr Variable steht, kann ich nun einfach mittels Marshal.PtrToStructure diesen Pointer zurück in meine Klasse umwandeln?

Laut Doku sollte ppValues auf ein Array zeigen.

var values = Marshal.PtrToStructure<XCVarValue>(info.ppValues);

Bei Marshal.PtrToStructure bekomme ich nun ein Objekt, aber kein Array. Wie kann ich das umsetzen?

Mfg

26.06.2016 - 12:51 Uhr

Hallo,

LPCSTR ist ein string


[DllImport("Toolbox.dll", CharSet = CharSet.Ansi)]
public static extern int Initialize( string systemPath, string license,  IntPtr logFunc);

Zu dem DLL_LogFunc solltest du in der API nachlesen wie hierzu die Definition aussieht. Aber einfach gesagt erwartet sich hier die C++ dll einen Pointer zu einer Methode.
Das kann man mittels eines delegate realisieren.

Sieh hierfür: Marshal Function Pointer

Beispiel für das arbeiten mit einem Delegate:


[UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void GatewayCallback(uint arg0, uint arg1, uint arg2, IntPtr arg3);

[DllImport(@"XXXX.dll",
            CharSet = CharSet.Ansi,
            EntryPoint = "CommSetCallback",
            SetLastError = true,
            CallingConvention = _callingConvention)]
        public static extern void CommSetCallback(GatewayCallback fCall);

Anschließend ist dann noch die Frage des Pointers:

DLL_LogFunc*

der * zeigt an das es sich um einen Pointer handelt.

16.06.2016 - 15:39 Uhr

Danke für die Antwort!

Habe nun mal versucht alles zusammen zu bringen.

BOOL  XC_CommUpdateValues(XCVarInfos* pInfos) 

ist die API Schnittestelle die ich ansprechen möchte. Diese Funktion nimmt einen Pointer of type XCVarInfos an. In *pInfos steht der Channel mit dem eine SPS angesprochen wird. Dort werden Daten aus einem Register gelesen und in einem Callback werden dann die Ergebnisse zurück geliefert.

Callback:

typedef BOOL  (CALLBACK *GATEWAYCALLBACK) (DWORD , ULONG, DWORD, LRESULT);

In C#:


[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void GatewayCallback(uint arg0, uint arg1, uint arg2, IntPtr arg3);

Der Callback scheint zumindest zu funktionieren, da ich hiermit z.B. Status der SPS, oder auch den Channel geliefert bekomme.

Laut der Doku soll nun die Funktion XC_CommUpdateValues ebenfalls einen Callback auslösen wo ich im arg3 den Pointer zu dem Result bekommen soll.

In meinem Projekt habe ich hierfür diese Wrapper Methode definiert:

        [DllImport(@"XC_Comm.dll",
            CharSet = CharSet.Ansi,
            EntryPoint = "XC_CommUpdateValues",
            SetLastError = true,
            CallingConvention = _callingConvention)]
        public static extern bool XC_CommUpdateValues(XCVarInfos pInfos);

Die zusätzlichen Typen die in der XCVarInfo Struktur benötigt werden:


typedef struct tagXCVarValue
{
	ULONG ulTimeStamp;
	BYTE  bQuality;
	BYTE  byData[1];
}XCVarValue;

typedef struct tagXCSymbolDesc
{
	LPSTR pszName;
	LPSTR pszType;
	WORD  uRefId;
	ULONG ulOffset;
	ULONG ulSize;
	char  szAccess[2];
}XCSymbolDesc;

typedef void* XCVARLIST;

Das ergibt dann bei mir alles zusammen:


    [StructLayout(LayoutKind.Sequential)]
    public class XCVarInfos
    {
        public IntPtr hVarList;
        public IntPtr ppValues;
        public IntPtr ppSymbolList;
        public TypeClass pTypeClass;
        public uint ulNumberOfSymbols;
        public uint ulChannel;
    }

    [StructLayout(LayoutKind.Sequential)]
    public class XCSymbolDesc
    {
        [MarshalAs(UnmanagedType.LPStr)]
        public string pszName;

        [MarshalAs(UnmanagedType.LPStr)]
        public string pszType;
        public ushort uRefId;
        public uint ulOffset;
        public uint ulSize;

        [MarshalAs(UnmanagedType.ByValArray ,SizeConst = 2)]
        public char[] szAccess;
    }

    [StructLayout(LayoutKind.Sequential)]
    public class XCVarValue
    {
        public uint ulTimeStamp;
        public char bQuality;

        [MarshalAs(UnmanagedType.ByValArray)]
        public char[] byData;
    }

Damit rufe ich nun meinen Wrapper auf:


_xcVarInfos = new XCVarInfos() { ulChannel = _channel , hVarList = new IntPtr()};

var value = new XCVarValue[5];
var pValues = (IntPtr)Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(XCVarValue)) * value.Length);
GCHandle gch = GCHandle.Alloc(pValues, GCHandleType.Pinned);
_xcVarInfos.ppValues = (IntPtr)gch.AddrOfPinnedObject();

var symbolList = new XCSymbolDesc[5];
var pSymbolList = (IntPtr)Marshal.AllocCoTaskMem(Marshal.SizeOf<XCSymbolDesc>() * symbolList.Length);
GCHandle gchSymbolList = GCHandle.Alloc(pSymbolList, GCHandleType.Pinned);
_xcVarInfos.ppSymbolList = (IntPtr)
gchSymbolList.AddrOfPinnedObject();
Wrapper.XC_CommUpdateValues(_xcVarInfos);

Habe ich hier nun mal vom Prinzip die Typen richtig definiert?

Mfg

16.06.2016 - 11:15 Uhr

@weismat, @Spook: Danke für eure Antwort. Glaub das ist was ich gesucht hab.

Habe dazu noch eine Frage:

typedef struct tagXCVarInfos
{
	XCVARLIST		hVarList;
	XCVarValue		**ppValues;
	XCSymbolDesc	**ppSymbolList;
	enum TypeClass	*pTypeClass;
	ULONG			ulNumberOfSymbols;
	ULONG			ulChannel;
}XCVarInfos;

Wie kann ich in aus dieser Struktur den Pointer of Pointer übersetzen?

16.06.2016 - 09:40 Uhr

Hallo,

Bin dabei einen Wrapper für eine C++ dll zu schreiben. In dieser dll gibt es diese Typ

typedef struct tagXCSymbolDesc
{
	LPSTR pszName;
	LPSTR pszType;
	WORD  uRefId;
	ULONG ulOffset;
	ULONG ulSize;
	char  szAccess[2];
}XCSymbolDesc;

Meine Frage hierzu wie übersetze ich nun am besten das Feld char szAccess[2] nach C#?

Mfg

14.05.2016 - 08:53 Uhr

Nach dem Deinstallieren von DevExpress und Syncfusion Extensions scheint das Problem behoben zu sein.

13.05.2016 - 18:31 Uhr

Hallo,

OS: Windows 10 Pro 64bit
Hab Visual Studio 2015 Community installiert und verwendet gehabt. Während des Arbeitens kam eine Meldung in VS, dass der Arbeitsspeicher ausgelastet ist. (16GB Arbeitsspeicher stehen zu Verfügung, ausgelastet waren 40%, VS hat allerdings 2,5GB belegt gehabt).
Nach einem Neustart von VS wurden 3,4GB von VS ausgelastet und stürzte ab. Hab auch schon eine Neuinstallation vorgenommen, allerdings half es nicht.

Was könnte ich versuchen VS wieder zum Laufen zu bringen?

Mfg Yeats

22.02.2016 - 10:06 Uhr

Hallo,

Wenn du dir die Objekte in einer Liste anzeigen lassen möchtest, dann wäre eine herangehensweise, dass du dir ein ViewModel erstellst das du dann an die View bindest.

In diesem ViewModel stellst du dann ein Property IEnumerable MessageContentxyz zur Verfügung das vom Typ Basisklasse/Interface.

Dieses Property kannst du dann an die ListView binden und mittels Templates und Styling so anpassen, dass es deinen wünschen entspricht.

11.12.2015 - 21:49 Uhr

Hallo,

Sieh dir dazu Drei- Schichten- Architektur an, dazu noch das Repository Pattern.