Я столкнулся с интригующей проблемой. У меня есть приложение из нескольких сборок. Я установил приложение, но забыл одну маленькую несущественную сборку. Приложение, казалось, запускалось и работало нормально, пока я не нашел метод, который требовал использования этой сборки. Как вы уже догадались, я вижу исключение "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 выполняться в этом случае без чрезмерной реструктуризации или принятия душа, я имею в виду использование отражения?