C# Code in C++ Projecten verwenden!
-
Kann man einen C# code
in einen C++ Project verwenden ?
könnte jemand ein beispiel machen ?wäre mir sehr hilfreich
ich danke alle die sich hier melden und mir weiter helfen könnenoder gibt es einen andern weg einen C# code nach C++ zu convertieren ?
wenn ja bitte hier sagen wie und wo ^^
danke auch schon im vorraus-euer
--C# zu C++
-
Hi,
C# ist doch von MS entwickelt?!?
Und C++ ist ne komplett andere Sprache, also standardmäßig kann man meines wissens nur inline asm in C++ verwenden!
Den c# Code in C++ Code umwandeln weiß ich nicht schau in google eventuell mal nach C# to C++ Converter.MFG ReduX
-
C# und C++ sind vom Syntax her sehr ähnlich, so dass du leicht (wenn es nicht zu viel Code ist) den Code von Hand anpassen kannst. Habe das ganze schon umgekehrt gemacht und es war nicht allzuschwierig. Wenn du C++ programmieren kannst kannst du auch mit C# umgehen. Es gibt einige neue Schlüssselwörter und die Library-Funktionen heissen anders, aber nichts was allzugrosse Schwierigkeiten bereiten sollte.
-
C# zu C++ schrieb:
Kann man einen C# code
in einen C++ Project verwenden ?Nein, aber wie schon durch die Vorposter genannt ist C# Syntaktisch dem C++ angeleht. Ein großer Harken bei der Sache ist, das ANSI C++ nicht so Themenübergreifende Bibliotheken mitbringt wie C# und .NET.
Daher ein paar andere Fragen:
a) Was ist dein Grund von C# nach C++ zu wechseln
b) Wie intensiv verwendet dein C# Projekt die .NET Bibliothek?
c) Soll dein C++ Code komplett natives C++ sein, oder managed C++ (und damit auch die .NET Bibliotheken nutzen können, mit allen Vor- und Nachteilen).Ggf. solltest du dir mal Managed C++ oder besser C++/CLI anschauen, dies sind beides Sprachdialekte die auf C++ aufbauen aber von Microsoft an das .NET Framework angepasst wurden sind. Mit C++/CLI kannst du fast alles was in C# geschrieben wurde 1:1 portieren (Mit etwas anderer Syntax), auch wenn ich dann nicht ganz den Sinn sehen würde.
C# zu C++ schrieb:
könnte jemand ein beispiel machen ?
Dir wird es sehr schwer fallen Beispiele für die Portierung von C# nach C++ zu finden (Grade wenn es um mehr als Konsolenprogramme gehen sollte), grade ohne genauere Angaben was dein Ziel dabei ist.
cu André
-
Warum nutzt du nicht einfach C++/CLI? Durch die gegebene Interoperalität sollte es doch kein Problem sein deinen C# Code in ein C++/CLI Projekt zu integrieren.
-
ich müsste nämlich diesen code :
in meinen C++ project verwendenpublic sealed class CheckRevision private static readonly uint[] hashcodes = new uint[] { 0xE7F4CB62, 0xF6A14FFC, 0xAA5504AF, 0x871FCDC2, 0x11BF6A18, 0xC57292E6, 0x7927D27E, 0x2FEC8733 }; private CheckRevision() { } public static int DoCheckRevision( string valueString, string[] files, int mpqNumber) { if (valueString == null) throw new ArgumentNullException("valueString", Locales.GetString(ResID.crValstringNull)); if (files == null) throw new ArgumentNullException("files", Locales.GetString(ResID.crFileListNull)); if (files.Length != 3) throw new ArgumentOutOfRangeException("files", files, Locales.GetString(ResID.crFileListInvalid)); uint[] values = new uint[4]; int[] opValueDest = new int[4]; int[] opValueSrc1 = new int[4]; char[] operation = new char[4]; int[] opValueSrc2 = new int[4]; string[] tokens = valueString.Split(new char[] { ' ' } ); int currentFormula = 0; // while (stringTokenizer.hasMoreTokens()) for (int i = 0; i < tokens.Length; i++) { string token = tokens[i]; // as long as there is a '=' in the string if (token.IndexOf('=') != -1) { string[] nameTokens = token.Split(new char[] { '=' } ); if (nameTokens.Length != 2) return 0; int variable = getNum(nameTokens[0][0]); string value = nameTokens[1]; // If it starts with a number, assign that number to the appropriate variable if(char.IsDigit(value[0])) { values[variable] = uint.Parse(value); } else { opValueDest[currentFormula] = variable; opValueSrc1[currentFormula] = getNum(value[0]); operation[currentFormula] = value[1]; opValueSrc2[currentFormula] = getNum(value[2]); currentFormula++; } } } // Now we actually do the hashing for each file // Start by hashing A by the hashcode values[0] ^= hashcodes[mpqNumber]; for (int i = 0; i < files.Length; i++) { FileStream currentFile = new FileStream(files[i], FileMode.Open, FileAccess.Read, FileShare.Read); int fileLength = (int)currentFile.Length; int bufferSize = -1; byte[] byteBuffer = null; MemoryStream buffer = null; if (fileLength % 1024 == 0) { Debug.WriteLine(files[i], "0 padding for"); bufferSize = fileLength; byteBuffer = new byte[bufferSize]; currentFile.Read(byteBuffer, 0, bufferSize); } else { int paddingBytes = (1024 - (fileLength % 1024)); Debug.WriteLine(files[i], paddingBytes + " bytes padding for"); bufferSize = fileLength + paddingBytes; byteBuffer = new byte[bufferSize]; currentFile.Read(byteBuffer, 0, fileLength); byte currentPaddingByte = 0xff; for (int j = fileLength; j < bufferSize; j++) { unchecked { // prevent underflow when rolling from 0 to 0xff. byteBuffer[j] = currentPaddingByte--; } } } buffer = new MemoryStream(byteBuffer, 0, bufferSize, false); BinaryReader br = new BinaryReader(buffer); for (int j = 0; j < bufferSize; j += 4) { values[3] = br.ReadUInt32(); for (int k = 0; k < currentFormula; k++) { switch (operation[k]) { case '+': values[opValueDest[k]] = values[opValueSrc1[k]] + values[opValueSrc2[k]]; break; case '-': values[opValueDest[k]] = values[opValueSrc1[k]] - values[opValueSrc2[k]]; break; case '^': values[opValueDest[k]] = values[opValueSrc1[k]] ^ values[opValueSrc2[k]]; break; case '*': // as shady said, you never know. values[opValueDest[k]] = values[opValueSrc1[k]] * values[opValueSrc2[k]]; break; case '/': // in case blizz gets "sneaky" values[opValueDest[k]] = values[opValueSrc1[k]] / values[opValueSrc2[k]]; break; } } } } return unchecked((int)values[2]); } private static int getNum(char c) { c = char.ToUpper(c); if(c == 'S') return 3; else return c - 'A'; } public static int GetExeInfo( string fileName, out string exeInfoString) { if (fileName == null) throw new ArgumentNullException(Locales.GetString(ResID.param_fileName), Locales.GetString(ResID.crExeFileNull)); string file = fileName.Substring(fileName.LastIndexOf('\\') + 1); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); uint fileSize = unchecked((uint)fs.Length); #if NET_1_1_OR_NEWER DateTime ft = File.GetLastWriteTimeUtc(fileName); #else DateTime ft = File.GetCreationTime(fileName); ft = ft.ToUniversalTime(); #endif FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileName); int version = ((fvi.FileMajorPart & 0x00ff0000) << 8) | ((fvi.FileMajorPart & 0x000000ff) << 16) | ((fvi.FileMinorPart & 0x00ff0000) >> 8) | (fvi.FileMinorPart & 0x000000ff); exeInfoString = String.Format( Locales.GetString(ResID.exeInfoFmt), file, ft.Month, ft.Day, ft.Year % 100, ft.Hour, ft.Minute, ft.Second, fileSize ); return version; } } }
-
Das ist ja riesig. Vielleicht solltest du es mal Stück für Stück übersetzen und sehen, was herauskommt.
- Anstelle von Arrays würde ich std::vector<> verwenden (C++ hat zwar auch Arrays, aber die haben feste Länge)
- einige Funktionen wie Split() mußt du vermutlich selber schreiben
- in C++ verwendet man deutlich weniger new - und dafür mehr Stack-Variablen
- ...
-
Zwei Funktionen habe ich schon übersetzt nur bei der DoCheckRevision habe ich probleme
weil ich zb keine ahnung habe was :if (valueString == null) throw new ArgumentNullException("valueString", Locales.GetString(ResID.crValstringNull)); if (files == null) throw new ArgumentNullException("files", Locales.GetString(ResID.crFileListNull)); if (files.Length != 3) throw new ArgumentOutOfRangeException("files", files, Locales.GetString(ResID.crFileListInvalid));bedeuted oder wie man das umwandeln kann in C++
hier sind die zwei von mir übersetzen:
LPSTR GenerateExeString(char *File,char *Exe) { FILETIME ft; SYSTEMTIME st; LPSTR buffer = new char[]; LPSTR returnwert = new char[]; DWORD dwTotalSize = 0; sprintf(buffer,"%s%s",File,Exe); HANDLE hFile = CreateFile(buffer,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); GetFileTime(hFile, &ft, NULL, NULL); FileTimeToSystemTime(&ft, &st); dwTotalSize = GetFileSize(hFile, NULL); sprintf(returnwert, "%s %02u/%02u/%02u %02u:%02u:%02u %lu", Exe, st.wMonth, st.wDay, st.wYear % 100, st.wHour, st.wMinute, st.wSecond, dwTotalSize); return returnwert; } int ExtractMPQNumber(char *mpqName) { int ReturnNumber = -1; if(!strcmpi(mpqName,"")) return ReturnNumber; if(strlen(mpqName) >= 14) { if(mpqName[0] == 'v') { if((int)mpqName[9] - '0' < 10) { ReturnNumber = (int)mpqName[9] - '0';; return ReturnNumber; } return ReturnNumber; } else return ReturnNumber; } else if(strlen(mpqName) >= 12) { if(mpqName[0] == 'I') { if((int)mpqName[7] - '0' < 10) { ReturnNumber = (int)mpqName[7] - '0';; return ReturnNumber; } return ReturnNumber; } else return ReturnNumber; } return ReturnNumber; }
-
Die beiden Überprüfungen auf NULL kannst du dir ersparen, da C++ keine Null-Referenzen hat. Die letzte Überprüfung kannst du fast analog übernehmen:
static int DoCheckRevision( const string& valueString, const vector<string>& files, int mpqNumber) { if (files.size() != 3) throw out_of_range("falsche Größe für 'files'"); ...
-
so ich hab mich nun an die CheckRevision dran gemacht aber hänge gerade
könnte mir wer weiter helfen ?ich weiß nicht wie ich das mit den FileStream und der schleife da umwandeln soll vielleicht wisst ihr mehr und könnt mir weiterhelfen
(hoffentlich) danke auch schon im vorraus
soweit hab ich atm gemacht :ich habe sie bisschen geändert wenn sie fehlschlägt gibt sie 0 zurück wenn richig 1 und der wert wird einfach auf der dwCheckSum variable gespeichert
#define BUCR_GETNUM(ch) (((ch) == 'S') ? 3 : ((ch) - 'A')) #define BUCR_ISNUM(ch) (((ch) >= '0') && ((ch) <= '9')) BOOL CheckRevision(LPSTR lpValueString,LPSTR lpFile1,LPSTR lpFile2,LPSTR lpFile3,int intmpqNumber,DWORD *dwCheckSum) { ///// // Definitions & Checks ///////////////////////////// int ReturnValue = 0, intcFormula = 0, intValues[4], intValueA[4], intValueB[4], intValueC[4]; LPSTR lpszFileNames[3], lpVs, lpToken; char szOperation[4]; if(strlen(lpValueString) <= 0 || !strcmpi(lpFile1,"") || !strcmpi(lpFile2,"") || !strcmpi(lpFile3,"") || (intmpqNumber < 0) || (intmpqNumber > 10)) return ReturnValue; lpszFileNames[0] = (LPSTR)lpFile1; lpszFileNames[1] = (LPSTR)lpFile2; lpszFileNames[2] = (LPSTR)lpFile3; ///////////////////////////// lpVs = new char[strlen(lpValueString) + 1]; strcpy(lpVs,lpValueString); lpToken = lpVs; while(lpToken && *lpToken) { if(*(lpToken + 1) == '=') { int intVar = BUCR_GETNUM(*lpToken); if(intVar < 0 || intVar > 3) { PrintText("CheckRevision Error: Unknown Variable %c",*lpToken); delete [] lpVs; return 0; } lpToken += 2; if(BUCR_ISNUM(*lpToken)) { intValues[intVar] = atol(lpToken); } else { if(intcFormula > 3) { PrintText("CheckRevision Error: 3 is Max Formula Count!"); delete [] lpVs; return 0; } intValueA[intcFormula] = intVar; intValueB[intcFormula] = BUCR_GETNUM(*lpToken); szOperation[intcFormula] = *(lpToken + 1); intValueC[intcFormula] = BUCR_GETNUM(*(lpToken + 2)); intcFormula++; } } for (; *lpToken != 0; lpToken++) { if (*lpToken == ' ') { lpToken++; break; } } } delete [] lpVs; }ich hoffe ihr könnt mir weiter helfen
btw @CStoll ich arbeite lieber ohne string keine ahnung warum ^^
aber danke das mit erklärung wegen der Null-Referenzen.
-
ReduX schrieb:
Hi,
C# ist doch von MS entwickelt?!?
Und C++ ist ne komplett andere Sprache, also standardmäßig kann man meines wissens nur inline asm in C++ verwenden!
Den c# Code in C++ Code umwandeln weiß ich nicht schau in google eventuell mal nach C# to C++ Converter.MFG ReduX
Hi Redux,
C# wurde nicht von M$ entwickelt worden, sondern von der European Computer Manufacturers Association (ECMA, Genf), siehe z.B. http://www.ecma-international.org/publications/standards/Ecma-334.htm
C# lässt sich nicht nach C++ konvertieren, wenn man die verführerischen Möglichkeiten der net Bibliothek genutzt hat.
von Ney
-
Nexperty schrieb:
C# wurde nicht von M$ entwickelt worden, sondern von der European Computer Manufacturers Association (ECMA, Genf), siehe z.B. http://www.ecma-international.org/publications/standards/Ecma-334.htm
Nene, C# ist schon von Microsoft entwickelt worden und wird dies auch weiterhin. Erst das fertige Produkt (also jeweils C# 1, 2 und 3) wurde bzw. wird dann dem Standardisierungskommittee der ECMA vorgelegt und die nicken es ab.
C# lässt sich nicht nach C++ konvertieren, wenn man die verführerischen Möglichkeiten der net Bibliothek genutzt hat.
Aber sehr einfach nach C++/CLI (wobei hierbei die Konvertierung unnötig ist, man kann es einfacher als Bibliothek einbinden) und C++/CLI kann dann Funktionen exportieren, die man wiederum aus Standard-C++ aufrufen kann.