2009-12-11 2 views
0

У меня есть интересная ситуация, и я пытаюсь сделать то, что я даже не уверен, что это возможно.Загрузка сборки .NET 3.5 через отражение в .NET 2.0

У меня есть проект .NET 2.0, который через отражение загружает сборку и вызывает конкретный метод на этой сборке. Мы смотрим вперед и начинаем использовать .NET 3.5 в среде, но хотим минимизировать риск в отношении этого «хост-приложения». Поэтому мы пытались загрузить сборку .NET 3.5 из проекта в .NET 2.0, так как 3,5 является продолжением каркаса 2.0 и т.д.

Ну, в этом мы получаем следующее сообщение об ошибке:

The format of the file 'MyDllNameHere.DLL' is invalid

Итак, из-за внешнего вида это невозможно. Может ли кто-нибудь подтвердить это? Есть ли обходной путь?

Тогда второй вопрос, если это невозможно, можем ли мы перекомпилировать хост под .NET 3.5, а затем загрузить его сборки .NET 2.0 через отражение?

ответ

2

Вы не можете загрузить 3.5 сборки в 2.0, потому что они могут ссылаться на вещи, которых не было в структуре 2.0.

Вы можете сделать обратное, как вы упомянули, 3.5, чтобы загрузить 2.0 сборки без проблем.

+0

Хотя то, что вы говорите, имеет смысл, я просто полностью опроверг это. Я считаю, что это связано с тем, как .NET 2.0 и 3.5 работают вместе. –

+0

Моя ошибка; Я был неправ; см. ответ от Ганса ... – jvenema

4

Это невозможно, формат сборки не изменился между 2.0 и 3.5. .NET 3.5 использует ту же версию CLR и формат метаданных сборки. Единственная разница между версиями - это новый набор сборок, особенно те, которые поддерживают WPF, WCF и Linq. Попытка загрузить сборку 3.5, которая ссылается на типы из этих новых сборок, выдает совершенно другое сообщение об ошибке. Он будет жаловаться, что он не может найти сборку 3.5.

Вы получите исключение, подобное этому, когда вы на самом деле используете .NET 1.x версию CLR, формат сборки 2.0 изменился. Кроме того, хотя это сообщение не подходит для сообщения об исключении, вы получите исключение, жалующееся на формат сборки, если ваш код работает в 64-битной версии фреймворка, и вы пытаетесь загрузить сборку, которая содержит 32-битный собственный код. Или наоборот.

+0

Спасибо за это, вы действительно идентифицировали другую проблему с нашей системой ..... –

+0

В соответствии с более высокими целями SO, можем ли мы знать, что это было? –

+0

Yup! Отправьте мой ответ прямо сейчас! –

2

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

Прежде всего, значки были правильными, сообщение об ошибке, с которым я столкнулся, НЕ было надлежащим сообщением об ошибке. Мой код был неправильно вызван хост-приложением 1.1, а не хостом приложения 2.0.

Как только я переключился на приложение-хост 2.0, то есть, когда началась настоящая магия. Из моего приложения 2.0, которое просто загружает класс через отражение и выполняет определенный метод, я смог успешно создать экземпляр и выполнить метод, который содержался внутри сборки .NET 3.5, использующей LINQ.

Работает безупречно!

+0

Ну, для записи: сообщение об ошибке было правильным, вопрос был неправильным :) –

+0

У вас там очень правильный пункт. –

Смежные вопросы