Разница в загрузке DLL между режимами отладки и выпуска - PullRequest
1 голос
/ 23 февраля 2009

Использование Visual Studio 2005.

Вот интересный.

Для воспроизведения создайте новое решение с приложением и классом Windows. библиотека.

В библиотеке классов определите класс следующим образом:

public class SomeClassInDLL
{
    public string DoSomething()
    {
        return DateTime.Now.ToString();
    }
}

Получите приложение Windows для ссылки на библиотеку классов. Добавить кнопку и добавить этот код:

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            MessageBox.Show("about to call DoSomething");
            string ret = DoCall();
            MessageBox.Show(ret);
        }
        catch (Exception ex)
        {
            MessageBox.Show("error : " + ex.GetType().ToString() + " " + ex.Message);

        }
    }

    private string DoCall()
    {
        SomeClassInDLL c1 = new SomeClassInDLL();
        return c1.DoSomething();
    }

1) Скомпилируйте приложение в режимах отладки и выпуска. (в корзину \ Debug и bin \ Release каталогов)

2) Закройте Visual Studio и запустите приложение Windows из проводника Windows

3) Нажмите кнопку 1.

4) При появлении диалогового окна «по поводу вызова DoSomething» в проводнике Windows попробуйте удалить указанный файл DLL.

5a) если вы запустили версию режима отладки на шаге 2: вы можете удалить dll файл успешно. Это то, что я ожидаю, так как DLL вызывается внутри функции DoCall, а не непосредственно в button1_Click.

5b) если вы запустили версию режима выпуска на шаге 2: вы не можете удалить Файл DLL, потому что он, кажется, заблокирован приложением.

==

5a) это поведение, которое я ожидал, начиная с dotnet 1.1 дня. Есть идеи почему 5b) кажется, чтобы заблокировать dll раньше, чем это необходимо? Что-то делать с оптимизация что ли? Такое поведение загрузки DLL объяснено где-то?

ТИА.

1 Ответ

1 голос
/ 23 февраля 2009

В режиме разблокировки функция DoCall может быть встроена в обработчик событий нажатия кнопки.

Это означает, что загрузчик типов должен знать о SomeClassInDll намного раньше (отсюда и блокировка на dll)

Обратите внимание, что полагаться на это поведение опасно, загрузка типа может быть легко вызвана отражением, изменениями встроенной эвристики или изменениями в загрузчике типов (например, спекулятивная загрузка JIT зависимых методов - хотя это маловероятно )

...