JIT-компиляция с отсутствующими ссылками на сборки - PullRequest
1 голос
/ 25 февраля 2010

Я столкнулся с интригующей проблемой. У меня есть приложение из нескольких сборок. Я установил приложение, но забыл одну маленькую несущественную сборку. Приложение, казалось, запускалось и работало нормально, пока я не нашел метод, который требовал использования этой сборки. Как вы уже догадались, я вижу исключение "Could not load file or assembly 'Blah, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Blah' or one of its dependencies. The system cannot find the file specified.".

Ничего удивительного, верно? Да, установщик может быть исправлен, и моя проблема исчезнет, ​​но я хотел посмотреть, есть ли программный способ сделать это. Поэтому я попытался обернуть код, который использует несущественную сборку, в блок try и высвободить дорогой ресурс в блок finally, например:

public void MethodA()
{
    try
    {
        // Do stuff with non essential assembly
    }
    finally
    {
        // Release expensive resource here
    }
}

Думая, что JIT-компилятор выбросит из блока try, чтобы в конечном итоге вернуть управление блоку finally, и мой ресурс будет освобожден. Оказывается, JIT-компилятор выбрасывает в тот момент, когда вызывается метод.

Я думал о перемещении блока finally выше в цепочке вызовов, но этот метод вызывается из сотен мест. Я думал об использовании Assembly.Load для несущественной сборки, но идея использования отражения заставляет меня чувствовать себя грязно.

Есть ли способ заставить блок finally выполняться в этом случае без чрезмерной реструктуризации или принятия душа, я имею в виду использование отражения?

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Если сборка несущественна, то нет проблем с использованием Assembly Load. Я не понимаю, почему вы думаете, что это грязно. Отражение - это еще один аспект .NET

1 голос
/ 25 февраля 2010

Определите другой метод, который делает ваши вещи с несущественной сборки.

Назовите его из метода А.

Итак:

public void MethodA()
{
    try
    {
        MethodAImpl();
    }
    finally
    {
    }
}
...