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
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
Danke für die Antwort Abt.
Ich hatte eine solche Antwort erwartet. Danke für die Bestätigung!
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.
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
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
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.
Bower muss installiert werden.
npm install -g bower
Allerdings, dass weiß vielleicht jemand anderes besser, wird Bower selten verwendet.
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
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
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.
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
Hallo,
Stimmen die Namen deiner Properties mit den Namen der Spalten in der Tabelle überein?
Hallo,
Wie setzt du die Referenz auf den Modul-Typ?
Grüße
Ah, ja so betrachtet macht es natürlich Sinn.
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
Sieh dir dazu Omnisharp und das LanguageServerProtocol von Microsoft an.
Danke Abt,
Danke Th69
Der Pfad zu MSBuild war falsch konfiguriert.
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.
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
Danke für die Antwort!
Die Beschreibung des Strict Modes ist aber auch recht niedlich.
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!
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
@Abt: Danke für den Hinweis. Dann werde ich mal schauen wie das zu konfigurieren ist.
Die Spaces hab ich hinzugefügt, damit ++nicht ++in eine URL umgewandelt wird.
Danke,
Hat funktioniert
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
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()
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.
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?
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.
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
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.
Hallo Th69,
Dies aber nur solange die DLL im GAC oder im selben Programm Verzeichnis liegt.
@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?
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
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
Was möchtest du wissen?
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
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
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.
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
@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?
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
Nach dem Deinstallieren von DevExpress und Syncfusion Extensions scheint das Problem behoben zu sein.
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
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.
Hallo,
Sieh dir dazu Drei- Schichten- Architektur an, dazu noch das Repository Pattern.