Я продолжаю слышать об аде DLL - что это? [закрытый]

У меня есть 'класс', который делает это, и здесь это:

function QS(){
    this.qs = {};
    var s = location.search.replace( /^\?|#.*$/g, '' );
    if( s ) {
        var qsParts = s.split('&');
        var i, nv;
        for (i = 0; i < qsParts.length; i++) {
            nv = qsParts[i].split('=');
            this.qs[nv[0]] = nv[1];
        }
    }
}

QS.prototype.add = function( name, value ) {
    if( arguments.length == 1 && arguments[0].constructor == Object ) {
        this.addMany( arguments[0] );
        return;
    }
    this.qs[name] = value;
}

QS.prototype.addMany = function( newValues ) {
    for( nv in newValues ) {
        this.qs[nv] = newValues[nv];
    }
}

QS.prototype.remove = function( name ) {
    if( arguments.length == 1 && arguments[0].constructor == Array ) {
        this.removeMany( arguments[0] );
        return;
    }
    delete this.qs[name];
}

QS.prototype.removeMany = function( deleteNames ) {
    var i;
    for( i = 0; i < deleteNames.length; i++ ) {
        delete this.qs[deleteNames[i]];
    }
}

QS.prototype.getQueryString = function() {
    var nv, q = [];
    for( nv in this.qs ) {
        q[q.length] = nv+'='+this.qs[nv];
    }
    return q.join( '&' );
}

QS.prototype.toString = QS.prototype.getQueryString;

//examples
//instantiation
var qs = new QS;
alert( qs );

//add a sinle name/value
qs.add( 'new', 'true' );
alert( qs );

//add multiple key/values
qs.add( { x: 'X', y: 'Y' } );
alert( qs );

//remove single key
qs.remove( 'new' )
alert( qs );

//remove multiple keys
qs.remove( ['x', 'bogus'] )
alert( qs );

я переопределил toString метод, таким образом, нет никакой потребности назвать QS:: getQueryString, можно использовать QS:: toString или, поскольку я сделал в примерах просто, полагаются на объект, принуждаемый в строку.

43
задан Michael Mrozek 20 September 2012 в 18:49
поделиться

5 ответов

Это когда приложение A устанавливает Shared DLL v1.0, приходит приложение B и обновляет Shared DLL до версии v1.1, которая должна быть совместимой, но поведение немного другое, тогда приложение A перестает работать правильно и переустанавливает v1.0, после чего приложение B перестает работать ... теперь представьте себе это с более чем двумя приложениями, скажем с дюжиной: DLL Hell.

66
ответ дан 26 November 2019 в 22:45
поделиться

Ад DLL был в основном из времен COM, когда COM-DLL должна была быть зарегистрирована, и клиенты ее смотрели вверх в реестре. Это был кошмар, потому что файловая система (* .dll, * .ocx) могла быть изменена, оставляя устаревшие записи в реестре. Приложения перестали работать, это было ужасно.

Затем вы получите сценарий, в котором новое приложение устанавливает и регистрирует новую версию DLL, тем самым нарушая работу приложений, которым действительно нужна старая версия. Вы бы переустановили старое приложение и сломали новое в процессе.

С .NET, есть '

13
ответ дан 26 November 2019 в 22:45
поделиться

Просто - в предыдущих версиях Windows можно было иметь несколько приложений, пытающихся получить доступ к одной и той же общей библиотеке. Нет проблем, поэтому они и делятся. проблема возникает, когда разные приложения пытались получить доступ к разным версиям одной и той же сборки из центра. Обеспечение обратной совместимости всех более поздних версий библиотеки DLL и наличие последней версии не должно быть проблем, но если вы установите приложение, для которого требуется v2, а затем установите приложение, которое требует (и включает) версию 1. x, вы можете обнаружить, что первое приложение перестает работать (потому что dll v2 была перезаписана на v1.x).

Последние версии Windows могут хранить несколько версий библиотеки DLL и предоставлять правильную версию по запросу.

6
ответ дан 26 November 2019 в 22:45
поделиться

Это происходит, когда приложение устанавливает DLL в систему, а другое приложение заменяет ее другой версией библиотеки DLL, несовместимой со старой.

Это не проблема C # (и .NET в целом), поскольку сборки .NET достаточно умны, чтобы учитывать версии (а в .NET есть GAC, который управляет разными версиями).

4
ответ дан 26 November 2019 в 22:45
поделиться

Короче говоря, в старые добрые времена COM каждый компонент COM должен был быть зарегистрирован (запись была создана в реестре) перед это было использовано. Затем ваша программа создаст новый объект, указав имя типа (которое было ключом в реестре). И теперь у вас не было никакого контроля над тем, какая dll будет действительно загружена, будет ли какое-либо другое программное обеспечение регистрировать какую-либо более новую / старую / совершенно другую версию этой dll и т.д.

6
ответ дан 26 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: