none
Code-Optimierung in MS-Bibliotheken RRS feed

  • Allgemeine Diskussion

  • Ich programiere unter VS2010(C#). Seit Tagen versuche ich aus einer alten IB-Datenbank Blob-Felder auszulesen. Das ist aber nicht das Thema, da habe ich schon genug gefunden. Leider hat es nicht funktioniert, es gab nur unerklärliche Exceptions. Bis ich dann gestern den von Microsoft freigegebenen Code zum Debuggen heruntergeladen habe.

    In OleDbDataReader.cs in der Routine DoValueCheck verschwindet zum Ende hin der übergebene Parameter (angeblich aus Optimierungsgründen). Also bekommt die aufrufende Routine DoSequentialCheck Unsinn zurück, was diese aber nicht anficht. Erst die von mir aufgerufene Routine GetBytes kann damit nichts anfangen und das führt zu der mir nun einleuchtenden Exception.

    Also nun die Frage: Wie kann ich in den Microsoft-Bibliotheken die Optimierung unterdrücken?

    Mein Code wird ja im Debug-Modus ohnehin nicht optimiert.

    Gruß, Heiko

    Donnerstag, 5. Januar 2017 13:16

Alle Antworten

  • Hallo Heiko,

    das kannst du so ohne weiteres gar nicht, da du ja am Ende nur die von Microsoft kompilierte DLL verwendest.
    Auf die Schnelle könntest du maximal die Bibliothek selbst neu kompilieren, aber das ist dann natürlich nicht die richtige .NET DLL sondern eine eigene.

    Ich weiß nicht inwiefern diese Teile von .NET auf GitHub liegen, ggf. könntest du dort dann einen Pull Request mit einem Fix dazu aufmachen.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Donnerstag, 5. Januar 2017 15:11
    Moderator
  • Hallo Tom,

    vielen Dank, aber das ist mir zuviel Aufwand, denn es bringt nichts. Auch weiss ich nicht, ob das rechtlich o.k. wäre.

    Aber wie kann in der Routine:

    private MetaData DoValueCheck(int ordinal) {
       if (!_isRead) {
           // Read hasn't been called yet or no more data
           throw ADP.DataReaderNoData();
       }
       else if (_sequentialAccess && (ordinal < _nextValueForRetrieval)) {
           throw ADP.NonSequentialColumnAccess(ordinal, _nextValueForRetrieval);
       }
       // @usernote: user may encounter the IndexOutOfRangeException
       MetaData info = _metadata[ordinal];
       return info;
    }

    der Übergabeparameter in der vorletzten Zeile nicht mehr gültig sein? Das erscheint mir recht unlogisch. Als ich noch Assembler programmiert habe, war ich der "Herr" im Hause.

    Mal sehen, ob ich etwas eigenes hinbekomme. Sicher nur mit unsicherem Code ;-)

    Gruß, Heiko

    Freitag, 6. Januar 2017 10:55