Also besser geeignet wäre XML aber ich kann auch JSON nehmen. Hm vielleicht nehme ich doch XML.
Hier ein link an allen, die noch nicht wissen, wie man ein Text/XML/JSON Datei in Visual Studio einbinden kann. 😃
https://www.youtube.com/watch?v=874NuVyFg7I
Danke!
Schone Grüße
doubleII
Ich danke allen, die geschrieben haben.
Ich habe mich immer noch nicht entschieden welche Dateityp soll ich nehmen. Ich versuche es zu konkretisieren .
Es geht um Kameraeinstellungen, die beim Laden der Benutzeroberfläche gelesen werden müssen, also von einer Seite es geht um Standard Kameraeinstellungen, von anderer Seite, wenn man die Einstellungen ändert, sie können gespeichert werden, wenn der User will.
Ich habe ein Objekt (Allgemeine Einstellungen) und in diesem Objekt andere Objekte, wenn man JSON nimmt (so weit ich die Sprache verstanden habe)
In diesem äußeren Objekt (Allgemeine Einstellungen) existieren Toolboxen (die andere Objekte). Sie haben eigene Einstellungen. Das ist alles.
Es ist nicht viel. Was würdet ihr für solche Einstellungen empfehlen.
Abt hat folgendes geschrieben:
ini Dateien sind ein Relikt und haben schon lange ihre Nachfolger - eben wegen den vielen Nachteilen! - gefunden: in XML und Json.
- ini Dateien sind nur schwer bzw. umständlich pragrammatisch zu lesen
- sie können nicht validiert werden
- haben keinerlei Hierarchiemöglichkeit
Es ist Absicht, dass .NET von Haus aus keine INI-Unterstützung hat.
Sonst wäre dieses Konstrukt heute noch im Einsatz - ist es aber Gott sei dank in aktueller Software kaum noch.
Alles ist besser als eine ini Datei.
Okay dann bleiben die beide .xml, .json. Ich habe irgendwo gelesen, dass die XML-Doku bei Microsoft nicht großartig erklärt wird.
Pinki hat noch YAML als Möglichkeit gegeben.
Ich möchte was einfaches nehmen.
Vielen Dank!
Okay mir ist es das alles nicht so eindeutig aber Danke. 😃
Ich habe die .json Datei oben in der linken Ecke habe ich Schema: http.//json.schemastore. (Auswahl)
Für was sind die Schema? Was heißt das genau? Sind Verschiedene auto Schemas oder etwas anderes?
string JSONstring = File.ReadAllText("generalConfig.json");
Warum habe ich einen Fehlermeldung > Fehlermeldung:
Die Datei wurde nicht gefunden.
Nochmal Vielen Dank!
Alles klar. Danke.
Ich habe eine Frage jetzt. Ich habe von NuGet Newtonsoft.json installiert. Muss ich dann eine .json oder .js erstellen?> Fehlermeldung:
unexpected character encountered while parsing value . path '' line 0 position 0
Danke!
Vielen Dank,
ich habe ein paar JSON Tutorial angeschaut, ich glaube, nehme ich JSON. XTM ist mir etwas schwer, glaube ich.
Warum auf kein Fall ini File. Was meint ihr damit?
Schöne Grüße
doubleII
An alle, die das gleiche Problem treffen. Die Lösung ist in der FreeImageBitmap class. Da System.Drawing ein default Bitmap Objekt erstellt, der 32 Bit ist. Auch schneller
Schöne Grüße
doubleII
Hallo,
was wäre einfacher, wenn man Einstellungen einer Benutzeroberfläche speichern, aufrufen, ändern (also Speicherverwaltung) möchte. Ini File oder XML? Was würdet ihr mir empfehlen?
Schöne Grüße
doubleII
ja genau voller Treffer. Ich muss mit win32 API arbeiten. Es wird eine nicht verwaltete Funktion, die in einer Dll Datei implementiert ist, aufgerufen.
sie lautet :
//Deklaration
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl,")]
public static extern int Execute(int count, [MarshalAs(UnmanagedType.LPArray)] HBITMAP[] bitmaps);
private void btnExecute(object sender, EventArgs e)
{
Bmp[0] = GetHbitmap();
Execute(count, Bmp);
}
ich verstehe immer noch nicht wie ich das machen muss.
😦 .
Vielen Dank!
Schöne Grüße
doubleII
Hallo zusammen, ich habe folgendes Problem. Ein 8 Bit Bitmap image wird in BmpSource1 gespeichert. Das Bild übergebe ich weiter an dem Pointer Bmp mit Hilfe der GetBitmap() Methode.
Hier wird interessant. Das Bild wird 32 Bit. Hat jemand eine Idee, wie kann ich das Bild an dem Pointer übergebe ohne das Format zu ändern?
using HBITMAP = System.IntPtr;
public HBITMAP[] Bmp { get; private set; } = new HBITMAP[6];
DepthSVB1 = Image.GetPixelFormatSize(BmpSource1.PixelFormat); //8 Bit Image
Bmp[0] = BmpSource1.GetHbitmap(); // GetBitmap() gibt ein 32 Bit Bild zurück oder?
Bitmap bitmaps = Image.FromHbitmap(Bmp[0]);
DepthSVB2 = Image.GetPixelFormatSize(bitmaps.PixelFormat); // ich überprüfe das Format wieder. Hier wird 32 Bit Image.
Warum passiert das, kann mir jemand erklären?
Schöne Grüße
doubleII
Hallo weismat,
Interop/Nativen Code verwendest, dann muss alles 100 % korrekt sein.
ok, verstehe. Danke!
Eine Zugriffsverletztung kann auch ein Fehler beim Ein/Auspacken sein.
Ich persönliche arbeite da am liebsten mit einer eigenen DLL und habe minimalistische Test-Konsolenprogramme zum einfachen Testen jeder externen Funktion.
Ja, ich bin kein Programmier, sondern Elektrotechniker und miss ich immer was zusammen basteln. DLL Datei habe ich selber noch nicht erstellt, aber das muss auch lernen.
Gruß
doubleII
In diesem Fall die Fehlermeldung zeigt, dass die Signatur nicht richtig definiert wurde.
Also dann es ist noch etwas faul.
Danke für die Anweisung. Ich habe noch eine Methode, die die gleiche Fehlermeldung zeigt.
HWND showWindows(HWND hWnd, bool show, bool select)
Hwnd habe ich als IntPtr zugewiesen. Hm, okay danke. Dann weiß ich zumindest was die Fehlermeldung hier sagt.
Schöne Grüße
diubleII
Hallo Abt,
Ich greife mit Hilfe der Funktion (GetString) in einer Toolbox zu. In der Toolbox sind mehrere Parameter gespeichert und jeder Parameter liefert einen Wert zurück.
Bsp. Result.Status = 15 (als String). Wenn ich Result.Status in textbox2 eingebe muss ich im textbox3 15 (value muss 15 zurückliefern) bekommen.
int GetString(const char* Tag,
char* Value,
UINT ValueSize,
BOOL* Valid);
Die Funktion habe ich in c# so umschreiben.
Wäre mir aber neu, dass man dem StringBuilder bei nem LPStr ne fixe Größe mitgeben kann, wenn das die Signatur nicht unterstützt (zB in Form eines BufferSize Parameters)
ich habe die so umgeschrieben. Es war Fehler von mir.
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int GetString([MarshalAs(UnmanagedType.LPStr)] string tag, [MarshalAs(UnmanagedType.LPStr)]string valueStr, uint valueSize, bool valid);
private void btnGetString_Click(object sender, EventArgs e)
{
bool valid = true;
uint valueSize = 1024;
string tag =" ";
string valueStr = " ";
//String auslesen
tag = textBox2.Text; // wird ein String gespeichert Bsp. Result.Status
try
{
// send 0 for succeed, or error code
int getString = GetString(tag, valueStr, valueSize, valid); // hier tritt die Fehlermeldung ein
textBox3.Text = valueStr.ToString(); // der Wert, der zurückgeliefert werden soll
if (valueStr != null)
{
checkBoxValid.Checked = true;
}
if (getString == 0)
{
textBox3.Text = valueStr.Length.ToString();
checkBoxValid.Checked = true;
}
else
{
textBox3.Text = "FALIED";
}
}
catch(StackOverflowException)
{
MessageBox.Show("Stackoverflow!");
}
}
Schöne Grüße
doubleII
Hallo zusammen,
ich weiß, dass der Fehler sehr allgemein und oft auftritt, aber ich finde keine Lösung und bitte um etwas Hilfe. Es wird ein Parameter unter Tag gespeichert, wenn der Wert korrekt eingegeben ist die Funktion GetString liefert der String, der unter value ist, zurück und getString = 0.
die Fehlermeldung:> Fehlermeldung:
Ausnahme ausgelöst bei 0x0E07F489 (Toolbox.dll) in Version.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000000.
Danke!
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int GetString([MarshalAs(UnmanagedType.LPStr)] string tag, [MarshalAs(UnmanagedType.LPStr)]string value, uint valueSize, bool valid);
private void btnGetString_Click(object sender, EventArgs e)
{
StringBuilder tag = new StringBuilder("");
StringBuilder value = new StringBuilder("", 1024);
bool valid = false;
int valueSize = value.Capacity;
//String ausgeben
tag.Append(textBox2.Text);
listBox1.Items.Add("I'm Tag :" +tag);
try
{
try
{
int getString = GetString(tag, value, valueSize, valid); // Die Zeile, wo der Fehler auftritt
listBox1.Items.Add("I'm GetString : " + getString);
// send 0 for succeed, or error code
if (getString == 0)
{
textBox3.Text = value.Length.ToString();
checkBoxValid.Checked = true;
}
else
{
textBox3.Text = "FALIED";
}
}
catch(StackOverflowException)
{
MessageBox.Show("Stackoverflow!");
}
}
catch (NullReferenceException ex)
{
MessageBox.Show(ex.ToString());
}
catch (DllNotFoundException ex)
{
MessageBox.Show(ex.ToString());
}
}
Hallo,
ich habe eine Frage. Es geht um folgendes. Es wird in einem Bitmap bm ein Bild gespeichert. Das Bild ist 8 Bit. Wie kann ich mit GetHbitmap() Methode ein 8 Bit anstatt 32 Bit Bitmapobjekt erstellen?
Danke!
Schöne Grüße
doubleII
Hallo Th69,
komischerweise habe den Code so umgeändert und es funktioniert.
[DllImport("E:\\Laser 2000\\Debug\\ScorpionVisionToolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
static extern int Execute(int count, ref HBITMAP[] bitmaps); //nur ref HBITMAP [ ]
// Die Funktion hat einen Ausgabetype HRESULT
// Den habe ich mit int ersetzt aber man kann auch mit
//HRESULT = System.IntPtr; es funktioniert
private void btnExecute_Click(object sender, EventArgs e)
{
int count = 0;
HBITMAP[] bitmaps = new HBITMAP[3];
bitmaps[0] = bm[0].GetHbitmap();
bitmaps[1] = bm[1].GetHbitmap();
bitmaps[2] = bm[2].GetHbitmap();
count = bitmaps.Length;
try
{
//LoadConfig(fname);
int hresult = Execute(count, ref bitmaps);
listBox1.Items.Add("I'm Execute: " + hresult);
}
catch (NullReferenceException ex)
{
MessageBox.Show(ex.ToString());
}
catch (DllNotFoundException ex)
{
MessageBox.Show(ex.ToString());
}
}
Be der Funktion habe ich wieder das gleiche Problem und die Funktion ist ziemlich einfach.
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int GetString([MarshalAs(UnmanagedType.LPStr)] string tag, [MarshalAs(UnmanagedType.LPStr)]string value, uint valueSize, bool valid);
private void btnGetString_Click(object sender, EventArgs e)
{
bool valid = true;
uint valueSize = 1024;
string tag =" ";
string value = " ";
//String ausgeben
tag = textBox2.Text; // wird ein String gespeichert
listBox1.Items.Add("I'm Tag von Getstring:" +tag);
try
{
if(String.IsNullOrEmpty(tag))
{
listBox1.Items.Add("Tag ist null");
}
int getString = GetString(tag, value, valueSize, valid); // hier tritt die Fehlermeldung ein
listBox1.Items.Add("I'm GetString: " + getString);
// send 0 for succeed, or error code
textBox3.Text = value.ToString(); // der Wert, der zurückgeliefert werden soll
if (value != null)
{
checkBoxValid.Checked = true;
}
}
catch (NullReferenceException ex)
{
MessageBox.Show(ex.ToString());
}
}
ich übergebe ihr einen Parameter (tag), wenn der Wert stimmt dann wird von der Toolbox ein Wert (velue) ausgelesen. Wenn ich die Funktion aufrufe und unkorrekten tag eingebe zeigt mir, dass der Parameter falsch ist, wenn ich der richtige schreibe zeigt mir wieder 0x00000000, obwohl eine NullReferenceExeption vorgesehen habe. Es zeigt mir unter
Auto -> this -> AccessibilityObject
folgende Fehlermeldung:> Fehlermeldung:
Der Ausdruck kann nicht evaluirt werden, da sich ein nativer Frame oben auf dem Stack befindet.
Ich habe für das Problem etwas gefunden aber es hilft mir irgendwie nicht.
http://stackoverflow.com/questions/10851719/cannot-evaluate-expression-because-a-native-frame-is-on-top-of-the-call-stack
Weiß du zufällig wie vermeidet man Stacküberlauf? Wie geht man mit diesem Problem um, bsp. hier?
Wäre super, wenn jemand darüber etwas reinschreibt.
Ich habe nicht geschrieben aber es ist eine Software 32 Bit.
Schöne Grüße
doubleII
Ich muss mal schauen, wie es gemacht wird.
Hallo Th69,
es hängt irgendwie. Ich lade die Bilder aber wenn ich sie auswerten möchte stürzt alles ab, es hat sich nichts geändert. Verstehe nicht.
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention=CallingConvention.Cdecl, EntryPoint = "Execute")]static extern int Execute(int count, [MarshalAs(UnmanagedType.LPArray)] HBITMAP[] bitmaps);
Beim Debugging unter Lokal
bekomme ich für bitmaps Bsp so was:
bitmaps
-> [0] {-184216928}
-> [1] {386207774}
aber ich bekomme keinen null Wert.
Hallo Th69,
wunderbar, vielen Dank für die Hilfe. Es funktioniert, aber wenn ich die Applikation von Debugging mode aufrufe es zeigt mir folgende Fehlermeldung:> Fehlermeldung:
Ausnahme ausgelöst bei 0x00000000(Toolbox.dll) in App.exe: 0xC0000005: Zugangsverletzung beim Lesen an Position 0x00000000.
Falls ein Handle für diese Ausnahme vorhanden ist, kann das Programm möglicherweise sicher ausgeführt werden.
Ich habe den Code so umgeschrieben:
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
static extern in Execute(int count, HBITMAP[] bitmaps);
private void btnExecute_Click(object sender, EventArgs e)
{
int count = 0;
HBITMAP[] bitmaps = new HBITMAP[2];
bitmaps[0] = bm[0].GetHbitmap(); // private Bitmap [] bm = new Bitmap[2];
bitmaps[1] = bm[1].GetHbitmap();
count = bitmaps.Length;
try
{
int execute = Execute(count, bitmaps);
listBox1.Items.Add("I'm Execute: " + execute);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
weißt du vielleicht woran kann es liegen? Der Fehler wird gezeigt, wenn
int execute = Execute(counter, bitmaps);
ausgefühlt wird. Zeigerproblem habe gesucht aber finde keine Lösung.
Schöne Grüße
doubleII
Hallo zusammen,
wenn ich nur ein Bild übergeben möchte
HBITMAP bitmaps = _bmp.GetHbitmap Method ();
funktioniert reibungslos. Jetzt habe ich mehr als eine Kamera (Beispiel zwei Kameras) und die Bilder von der beiden Kamera habe ich als
private Bitmap _bm1;
private Bitmap _bm2;
gespeichert. Ich muss sie jetzt an HBITMAP bitmaps übergebe. Hat jemand eine Idee wie ich es machen könnte. In diesem Fall ist der counter auf zwei -> Anzahl der Kameras.
😦
Vielen vielen Dank!
Hallo Spook,
habe auch versucht. Es zeigt mir folgender Fehler:> Fehlermeldung:
System.Runtime.InteropServices.SEHException(0x80004005): Eine externe Komponente hat eine Ausnahme ausgelöst.
Grüße
doubleII
ja stimmt, dumme Frage aber ich habe auch so mit der Methode versucht. Das Problem war wo anders. Jetzt passt. Danke 😃.
Es zeigt mir ein andere Fehler:
FEHLER:> Fehlermeldung:
"Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."
Nach Ihre Meinung ist die Funktion richtig in C# richtig deklariert?
in C++
int Execute(unsigned int count, HBITMAP* bmp);
using HBITMAP = System.IntPtr;
[DllImport("Toolbox.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
static extern int Execute(uint count, HBITMAP bmp);
Durch Google habe ich noch herausgefunden, dass es womöglich an der Aufrufkonvention stdcall liegt. Hat jemand eine Idee, woran kann es liegen?
Hallo, ich habe eine Frage und zwar, wie konvertiert man ein Bitmap format in einem HBITMAP um den Wert in einer Unmanaged Funktion zu übergeben?
[DllImport("Toolbox.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
static extern int Execute(uint Count, HBITMAP Bitmaps);
private void btnExecute_Click(object sender, EventArgs e)
{
uint Count = 1; // counter heißt 1 Kameras
HBITMAP Bitmaps = _bitmap; // in private Bitmap _bitmap wird das Image als Bitmap format gespeichert
try
{
//???????????????????????
int execute = Execute(Count, Bitmaps);
listBox1.Items.Add("I'm Execute: " + execute);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Vielen Dank!
Danke erst mal für den Tipps. Es hat funktioniert.
Dahingehend auch die Bitte Dich sich an [Hinweis] Wie poste ich richtig? zu orientieren
mache ich.
Hallo zusammen,
ich habe eine Frage und es geht um das Type HWND. Wie könnte ich die Funktion in CSharp umwandle. Könnte mir jemand Tips geben?
HWND ShowUserInterface(HWND hwnd, BOOL show, BOOL setupMode)
Vielen Dank!
Hallo TH69,
Wie meinst du das? ich habe die Dll Datei unter debug, Release, sogar unter
System32 gespeichert , funktioniert nicht. Oder ich mache etwas falsch? Ich bin offen, wenn man etwas einfach lösen kann.
Schöne Grüße
Hallo Yeats,
Das kling super. Kurz zusammengefasst, ob ich es richtig verstanden habe.
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);
}
jetzt kann ich im Speicher dll Datei laden.
Wie verbinde ich die Klasse jetzt mit meiner. Mach bitte ein Beispiel.
Vielen Dank!
Hallo Yeats,
ich habe das Problem gelöst jetzt funktioniert.
Könntest du mir etwas mehr den Code oben erklären.
Danke Yeats,
Die Lösung:
//geändert
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void DLL_Func(string logFunc);
[DllImport("E:\\Laser 2000\\Debug\\Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
Das kling super. Kurz zusammengefasst, ob ich es richtig verstanden habe.
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);
}
jetzt kann ich im Speicher dll Datei laden.
SetDllDirectory(@"..\..\..\DLL");
LoadLibrary("Toolbox.dll");
######################################
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void DLL_Func(string logFunc);
Gerade habe getestet. Der gleiche Fehler wird rausgespuckt. 😦
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Project_1
{
//geändert
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void DLL_Func(string logFunc);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("E:\\Laser\\Debug\\Toolbox.dll")]
static extern int Initialize(string systemPath, string license, DLL_Func logFunc);
private void btnExecute_Click(object sender, EventArgs e)
{
systemPath = @"E:\DLL\Debug\";
license = "zFm6pwdkz";
try
{
Form1.Initialize(systemPath, license, logFunc);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
//MessageBox.Show(ex.Message);
}
}
}
}
Ich bin ein Schritt weiter gekommen. Ich habe Zugriff auf der Toolbox. Ich habe viel ausprobiert und für die, die gleiches Problem wie ich haben. SEHR WICHTIG!
[DllImport("Pfad\DLLdatei.dll")]
Beispiel: [DllImport("E:\Laser\Debug\Toolbox.dll")]
Wenn man die DLL Datei ins system32 kopiert funktioniert auch nicht, die Dll Datei wird nicht gefunden.
Könnte mir jemand sagen, ob ich die funktion richtig ins C sharp umgeschrieben habe?
Das ist die Funkt. von Dll Datei:
typedef void LogFunc(char* msg);
int Initialize(const char* WorkingDirectory,
const char* License,
LogFunc* logFunc);
Parameters:
WorkingDirectory - writeable location which may be used by the library for configuration files, logging and debugging purpose.
License - Tordivel supplied license string to enable toolbox image processing.
logFunc - callback function for info and debug messages. Normally set to NULL.
Returns:
errorcode or 0 for succeed
ich habe den Code jetzt so umgeschrieben:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Project_1
{
// ????
public delegate void DLL_Func(string logFunc);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("E:\\Laser\\Debug\\Toolbox.dll")]
static extern int Initialize(string systemPath, string license, DLL_Func logFunc);
private void btnExecute_Click(object sender, EventArgs e)
{
systemPath = @"E:\DLL\Debug\";
license = "zFm6pwdkz";
try
{
Form1.Initialize(systemPath, license, logFunc);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
//MessageBox.Show(ex.Message);
}
}
}
}
Für die logFunc bin ich mir nicht sicher, ob man sie so als Delegate eingeben kann und der Wert, den sie liefert irgendwie ist mir nicht klar, ob es so richtig ist. Wäre dankbar, wenn mich jemand korrigieren kann. Es zeigt mir folgendes als Fehlermeldung:
"Zusätzliche Informationen: Ein Aufruf an die PInvoke-Funktion "Project_1!Project_1.Form1::Initialize" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen."
Danke!
Du kannst mit Hilfe von Assembly.Load nur CLR Assemblies bzw. Managed Assemblies wie Managed C++ laden.
Liegt diese Situation vor?
Danke! Es klingt logisch. Also wie Th69 geschrieben hat, "Assebly.LoadFile" ist überflüssig.
Verwende procmon um zu schauen, was genau er versucht zu laden und was fehlt.
Ist ne ziemliche Sisyphusarbeit aber so ists manchmal.
Ich habe etwas gefunden aber noch nicht ausprobiert. Was meint ihr muss ich was ändern oder passt es so. Wie ich den Code verstehe, er zeigt alle Prozesse.
using System.Diagnostics;
public static void Monitor()
{
ArrayList existingProcesses = GetExistingProcess();
while (true)
{
ArrayList currentProcesses = new ArrayList();
currentProcesses = GetCurrentProcess();
ArrayList NewApps = new ArrayList(GetCurrentProcess());
foreach (var p in ExistingProcess)
{
NewApps.Remove(p);
}
string str = "";
foreach (string NewApp in NewApps)
{
str = "Process Name : " + NewApp + " Process ID : " + System.Diagnostics.Process.GetProcessesByName(NewApp)[0].Id.ToString() + " ";
}
MessageBox.Show(str);
}
}
Hat jemand eine Ahnung was der Pointer "IntPtr logFunc" bekommt? es ist mir nicht ganz klar. 😦
Er ist nur als Beispiel. Es ist nicht der echte Key. 😃
Vielen Dank für die Info erst mal!
Ich habe heute ein Tipp bekommen. Ich kann die C++ Datei weglassen. D.h. ich darf direkt auf die dll Datei zugreifen (dll Datei ist auf Delphi geschrieben), also ich brauche keine Wrapper Klassen zu erstellen (so weit wie ich gelesen habe). Die Funktionen existieren in der dll Datei ich muss sie ansprechen. Es wurde mir so erklärt, dass ich das C++ Projekt als Muster nutzen kann. Ich habe ins Internet rescher-schiert und habe den Code so geschrieben:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
namespace Project_1
private IntPtr logFung;
[DllImport("Toolbox.dll", CharSet = CharSet.Auto)]
static extern int Initialize( string systemPath, string license, IntPtr logFung );
[DllImport("ScorpionVisionToolbox.dll", CharSet = CharSet.Auto )]
static extern int finalize();
private void btnExecute_Click(object sender, EventArgs e)
{
// Windows DLL (non-.NET assembly)
//systemPath = Environment.ExpandEnvironmentVariables("%SystemDrive%");
//if (!systemPath.Trim().EndsWith(@"\"))
// systemPath += @"\";
systemPath = @"E:\DLL\Debug\Toolbox.dll";
try
{
Assembly assem = Assembly.LoadFile(systemPath);
}
catch (DllNotFoundException ex)
{
MessageBox.Show(ex.Message);
}
//nur als Beispiel
license = "F7LRmIFGHcJkqAZfPV4sN1Tuga2SyKJeBL3ZJ0SBZPwRpoeXb8wZUYVcO3EQcwPUfzTQDcOlMC";
Initialize(systemPath, license, logFung);
}
}
}
es zeigt mir folgender Fehler:
Ein Ausnahmefehler des Typs "System.IO.FileNotFoundException" ist in mscorlib.dll aufgetreten.
Zusätzliche Informationen: Das System kann die angegebene Datei nicht finden. (Ausnahme von HRESULT: 0x80070002)
Ich habe unter Projekt -> Eigenschaften -> Estellen auf x86 eingestellt, da die Toolbox auf 32 Bit ist, keine Änderung.
Ich verstehe immer noch nicht was ich am IntPtr übergeben muss.
C++:
//Als Muster ich muss sie auf C# umschreiben. Sie existieren in der dll Datei.
int Toolbox::Initialize(LPCSTR systemPath, LPCSTR license, DLL_LogFunc* logFunc)
{
if (m_initialize) return m_initialize((char*)systemPath,(char*)license,logFunc);
return -1;
}
int Toolbox::Finalize()
if (m_finalize) return m_finalize();
return -1;
Hallo zusammen, Ich habe folgendes Problem:
Ich habe eine C# Application und ein C++ Projekt. MS Visual.net 2015.
Wie rufe ich jetzt von C# eine C++ Funktionen auf.
Suche schon einige Zeit und hab leider noch kein passendes Bsp. gefunden.
Wo könnte man mehr Info findet?
Ich habe eine Toolbox und der Code für sie ist auf C++ geschrieben, wie man oben als Beispiel eine Funktion sehen kann. Dll Datei habe ich zur Verfügung.
Ich wäre sehr dankbar , wenn mir jemand ein bisschen mehr erklären kann.
Vielen Dank!
Hier ist eine Funktion von dem C++ Code:
C ++ Funktion
int Toolbox::Initialize(LPCSTR systemPath, LPCSTR license, DLL_LogFunc* logFunc)
{
if (m_initialize) return m_initialize((char*)systemPath,(char*)license,logFunc);
return -1;
}
C Sharp
using System.Runtime.InteropServices;
namespace Project_1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("Toolbox.dll")]
public static extern int Initialize( ????? ); // Funktion keine Methode. Was muss ich zwischen Klammern schreiben???
private void btnExecute_Click(object sender, EventArgs e)
{
initialize( ???? );
}
}