Использование разных версий DLL в одном приложении - PullRequest
4 голосов
/ 12 октября 2009

У меня есть библиотека классов Silverlight, которая используется как приложением Silverlight, так и обычной службой CF WCF.

Приложение Silverlight вызывает службу WCF для чтения / записи некоторых данных. Они оба используют общую библиотеку для управления передаваемыми данными.

Все компилируется нормально, но когда мы запускаем приложение, веб-служба выдает следующую ошибку при вызове библиотеки silverlight:

«Не удалось загрузить файл или сборку» System.Xml, версия = 2.0.5.0, Culture = нейтральный, PublicKeyToken = 7cec85d7bea7798e 'или одна из его зависимостей. Система не может найти указанный файл. "

Это связано с тем, что библиотека классов silverlight ссылается на v2.0.5 файла System.Xml, а служба WCF ссылается на v3.5 файла System.Xml.

Есть ли способ, которым я могу ссылаться на обе версии и не получить ошибку?

Ответы [ 2 ]

2 голосов
/ 12 октября 2009

Если у вас есть источник для общей библиотеки, тогда лучший подход - это иметь 3 проекта, один для SL, один для WCF и один для источника общей библиотеки. Затем вы можете ссылаться на исходные файлы из общей библиотеки в проектах SL и WCF, используя опцию «Добавить как ссылку» в Visual Studio. Исходные файлы могут быть скомпилированы с правильными версиями библиотеки .Net. Хорошая вещь в этом заключается в том, что источником являются ссылочные копии, когда вы вносите изменения в общую библиотеку, проекты SL и WCF обновляются без дублирования.

Мы использовали этот подход в нашем продукте, и он работает очень хорошо.

НТН

2 голосов
/ 12 октября 2009

Нет, это не поддерживается в CLR (без большого взлома). Причина в том, что из-за фундаментального ограничения CLR. А именно, что один и только один mscorlib может быть загружен в экземпляр CLR.

Если у вас есть 2 версии System.Xml.dll, они будут ссылаться на 2 разные версии mscorlib. Это особенно верно для проектов Silverlight и не Silverlight, которые имеют радикально разные библиотеки mscorlib и BCL. Поэтому, когда вы пытаетесь загрузить вторую DLL-библиотеку System.Xml, она, в конце концов, попытается загрузить другой mscorlib, который обязательно завершится с ошибкой.

Причина, по которой я добавил предостережение "без большого количества взлома", заключается в обязательном перенаправлении. Я уверен, что есть некоторая замечательная магия привязки, которую вы можете вставить в app.config, чтобы перенаправить Silverlight System.Xml на полный System.Xml, чтобы он загружался функционально. Однако это почти наверняка приведет к ухудшению ошибок в будущем при выполнении программы.

...