Assembler-Code in C# einfügen
-
-
Sorry, dass ich mich jetzt erst melde.
Ich wollte das mal ausprobieren mit dem unmanaged code in C, hat aber nicht so wirklich geklappt.
Hier mal der Codeausschnitt
Die cpuid.cpp-Datei
// Dies ist die Haupt-DLL. #include "stdafx.h" #include "cpuid.h"
Die cpuid.h-Datei
// cpuid.h #pragma once using namespace System; namespace cpuid { // TODO: Die Methoden für diese Klasse hier hinzufügen. public ref class Class1 { static char pszCPUType[13]; _asm { mov eax, 0 cpuid getting information from EBX mov pszCPUType[0], bl mov pszCPUType[1], bh ror ebx, 16 mov pszCPUType[2], bl mov pszCPUType[3], bh getting information from EDX mov pszCPUType[4], dl mov pszCPUType[5], dh ror edx, 16 mov pszCPUType[6], dl mov pszCPUType[7], dh getting information from ECX mov pszCPUType[8], cl mov pszCPUType[9], ch ror ecx, 16 mov pszCPUType[10], cl mov pszCPUType[11], ch } pszCPUType[12] = '0'; return pszCPUType; }; }
da gibt mein Visual C++ 2005 folgende Fehlermeldungen raus.
Kompilieren...
cpuid.cpp
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(13) : error C2061: Syntaxfehler: Bezeichner 'pszCPUType'
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(13) : warning C4183: 'memset': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(15) : error C2059: Syntaxfehler: '__asm'
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(15) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(44) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(44) : error C3845: "cpuid::Class1::pszCPUType": Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden.
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(46) : error C2059: Syntaxfehler: 'return'
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(46) : error C2238: Unerwartete(s) Token vor ';'
c:\dokumente und einstellungen\ringostarr\eigene dateien\visual studio 2005\projects\cpuid\cpuid\cpuid.h(12) : error C4368: "pszCPUType" kann nicht als Member von "cpuid::Class1" (verwaltet) definiert werden: Gemischte Typen werden nicht unterstützt.
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Ringostarr\Eigene Dateien\Visual Studio 2005\Projects\cpuid\cpuid\Debug\BuildLog.htm" gespeichert.
cpuid - 9 Fehler, 1 Warnung(en)Wäre schön, wenn mir da jemand weiterhelfen könnte.
-
Ist dir aufgefallen, dass du gar keine funktionen definiert hast?
Du tust den assembler code einfach in die klasse reinschreiben.
-
Hmm ich kenn mich in Assembler nicht aus, aber Dir ist schon bewusst dass
char
ein UTF16 char und somit 2 Byte lang ist?
Dafür gibt es Byte als Datentyp.
-
Entweder ich steh auf dem Schlauch, oder das sieht sowas von gar nicht nach C# aus, scheint wohl C++ zu sein...
Edit:
Ringostarr schrieb:
da gibt mein Visual C++ 2005 folgende Fehlermeldungen raus.
Da haben wirs
-
Badestrand schrieb:
Entweder ich steh auf dem Schlauch, oder das sieht sowas von gar nicht nach C# aus, scheint wohl C++ zu sein...
Edit:
Ringostarr schrieb:
da gibt mein Visual C++ 2005 folgende Fehlermeldungen raus.
Da haben wirs
Jo, dann lies mal die Überschrift.
-
@Ringostarr:
Bitte definiere doch zunächst mal, mit welcher Sprache Du arbeitest.
-
SeboStone schrieb:
Jo, dann lies mal die Überschrift.
Lies doch selber die Überschrift
Wenn es C++ sein soll, dann kompiliert deine Lösung bei mir, nur dass der Code natürlich in eine Funktion gehört und nicht in eine Klasse (wie Dennis123 schon meinte).
-
@Dennis123: Ja, tut mir leid, ist mir gar nicht aufgefallen, ich hatte den Code einfach so kopiert und mir nichts weiter dabei gedacht
@pub00515: Ähm, Das mit dem char ist auch nur aus dem Codebeispiel von http://www.codeproject.com/csharp/unmanage.asp (Program 7) übernommen.
@Badestrand: Dass das C++ Code ist, weiß ich ja, ich will aber Assembler-Code ausführen und das geht meines wissens nach nicht in C#, deshalb der Umweg über C++ und dann mit der DLL-Datei verlinken.
@LordJaxom: eigentlich arbeite ich mit der Sprache C#, aber wie oben schon beschrieben, der Umweg über C++.
Ich hab mal noch ein bisschen rumgedoktort und bin jetzt bei folgendem C++ Code, der zu einer DLL-Datei kompiliert wird
#pragma once using namespace System; namespace cpuid { public class Class1 { Class1(); char* cpuid2(); } Class1(); char* Class1::cpuid2() { static char pszCPUType[13]; memset(pszCPUType, 0, 13); _asm { mov eax, 0 cpuid // getting information from EBX mov pszCPUType[0], bl mov pszCPUType[1], bh ......... ......... } pszCPUType[12] = '0'; //return pszCPUType; }; }
Die DLL binde ich dann in mein C# Programm ein, aber ich kann die Funktion nicht aufrufen. Was mache ich noch falsch?
-
Hast du angegeben, dass die Klasse/Funktion exportiert werden soll? Und eine Lib-Datei musst du glaubich auch erstellen.
Du kannst die DLL auch mit nem Editor öffnen und gucken, ob du (mit Strg+F) den String "cpuid" findest (ohne "@+'äöamsd" oder so danach). Wenn nicht, ist die Funktion in den DLL nicht drin.
-
Kompiliere die DLL als COM-DLL (ATL Projekt) und setze in C# einen Verweis darauf, dann wird die lib Datei automatisch erstellt und Du kannst sehr einfach auf Deine Funktionen zugreifen.
-
Hat beides leider auch nicht funktioniert, aber er meckert jetzt, dass er den Einstiegspunkt in der DLL nicht finden kann.