Компиляция .NET-компонента, который использует не конкретную обязательную версию стороннего поставщика - PullRequest
1 голос
/ 09 июня 2010

Если кто-то разрабатывает компонент .NET, основанный на неспецифических версиях DLL-библиотеки поставщика, - скажем, он работает с My3rdPartyComponent.dll, которая представляет собой сборку .NET, но не имеет значения, какая версия.

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

По сути, я хочу иметь возможность требовать, чтобы пользователь передавал экземпляр 3rdPartyComponent.MyClass функциям моего компонента, но мне все равно, если это версия 1.1, 2.2, 2.23.980 и т. Д. Сторонней библиотеки dll.

Есть ли способ сделать это, все еще печатая параметр, который я хочу передать моему компоненту? Я не хочу использовать объект в качестве ссылки.

В моем проекте компонента я мог указать SpecificVersion = True для ссылки на сборку. Решит ли это мою проблему или будут другие проблемы с dll hell, с которыми я не столкнусь?

1 Ответ

0 голосов
/ 09 июня 2010

По сути, нет, вы не можете делать то, что вы хотите (по крайней мере, насколько мне известно). Вся предпосылка версий .NET заключается в том, что разные версии сборки являются разными сборками. Таким образом, 3rdPartyComponent.MyClass версия 1.1 является совершенно другим классом от 3rdPartyComponent.MyClass версия 1.1.1 в отношении .NET. К лучшему или к худшему, вот как это работает.

Если у вас нет контроля над сторонней сборкой, то единственный способ поддержать это - использовать Reflection. Тип dynamic в .NET 4 должен сделать это довольно легко - но это все еще хак, и он потерпит неудачу, если интерфейс изменится малейшим образом (что, конечно, является целым пунктом управления версиями).

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

...