Хоча я маю конкретний випадок, але мені було цікаво про загальну ситуацію.
Чи можуть дві DLL-файли, додані як Посилання на проект Visual C #, стикаються між собою, щоб запобігти створенню рішення? Якщо це так, то які можливі способи пом'якшити це.
Хоча я маю конкретний випадок, але мені було цікаво про загальну ситуацію.
Чи можуть дві DLL-файли, додані як Посилання на проект Visual C #, стикаються між собою, щоб запобігти створенню рішення? Якщо це так, то які можливі способи пом'якшити це.
Відповіді:
Це дуже можливо.
Якщо ви визначили однакове простір імен та ім'я типу на різних збірках (або у вашому проекті та доданій збірці), ви отримаєте конфлікт із будь-яким кодом, який намагається використовувати той чи інший із цих типів.
Якщо ви переконаєтесь, що у вас є унікальні простори імен, як і у ваших посиланнях, у вас не виникне цієї проблеми.
Інша можливість пов'язана з різними версіями залежності - якщо ваш проект використовує (наприклад) бібліотеку журналу у версії 1.2, але додана збірка має залежність від тієї ж збірки, але іншої версії (скажімо 1.3) та будь-якого вашого проекту або додана збірка була налаштована / побудована для використання конкретної версії, ви отримаєте конфлікт, і збірка не вдасться.
Обидва ці проблеми можна вирішити за допомогою псевдонімів збірки, як описано тут .
Бачачи, як ніхто інший не згадував про це, ви запитали:
які можливі способи пом'якшити це
Існує чисте рішення саме для цього випадку, без обмежень і без дратівливих обхідних шляхів. Ви можете визначити аліменти для складання, щоб компілятор знав, на які слід звернутися в потрібному місці.
Погляньте на http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx
Так, це дуже можливо.
Скажімо, ви додали посилання на деяку DLL, яка використовує стару версію Lucene.Net, і ви хочете включити останню версію.
Ви можете вирішити цю проблему, використовуючи зовнішні псевдоніми: http://msdn.microsoft.com/en-us/library/ms173212.aspx
Ви можете розмістити стільки різних версій збірки, скільки потрібно в кеш глобальної асамблеї, за умови, що вони мають чітку назву. Це може допомогти вам, якщо ви хочете, щоб різні програми використовували різні версії збірки, машинно. Однак використання різних версій збірки в програмі ONE все одно спричинить вам проблеми.
Яка причина, що вам потрібні обидві версії одночасно?
Напевно. Ви можете отримати помилку компілятора "Неоднозначна довідка", коли два об'єкти неможливо розрізнити. Як правило, ви можете вказати повний шлях у коді, і це не спричинить проблеми, але якби dlls були повністю ідентичними, ви не змогли б розрізнити два об'єкти жодним чином. У нас є два будинки:
System.IO, який містить клас File
і
MyProject.IO, який містить клас File
Якби у вас було щось подібне ...
using System.IO;
using MyProject.IO;
...
private void foo()
{
File f = new File();
}
... ви б мали неоднозначну посилання, оскільки немає способу сказати, про який файл ви говорите. Це виправить це:
using System.IO;
using MyProject.IO;
...
private void foo()
{
MyProject.IO.File f = new MyProject.IO.File();
}
Єдиний спосіб було б важко виправити, якби шлях "File" був однаковим в обох складах, але це вимагало б малоймовірної ситуації, коли два dll мали однакову структуру простору імен. Наприклад, моя ситуація вище ніколи не відбудеться, оскільки ніхто не збирається назвати там проект "Система" (за винятком фактичних розробників рамки .Net).