2015-09-22 4 views
0

Если у меня есть приложение (приложение), ссылающееся на библиотеку (Lib1), которая сама ссылается на другую библиотеку (Lib2), когда приложение ссылается на Lib1, оно также скопирует DLL Lib2 и отлично работает.Конфликт имен имен на внешних зависимостях

Если я также добавлю другую ссылку на приложение в другую библиотеку, но с тем же именем, что и Lib2 (Lib2bis), Lib1 попытается использовать типы из Lib2bis вместо Lib2 (так как файл Lib2, я считаю, получает перезаписывается файл Lib2bis (с таким же именем).

Поскольку ссылки от приложения к Lib2 является косвенным, я не буду знать, что Lib2bis конфликты с Lib2 до исполнения, который приведет к ошибке выполнения.

ли есть ли способ предотвратить/разрешить эту проблему (кроме переименования библиотек ...) (в идеале, не используя псевдоним, но мне было бы интересно узнать решение псевдонимов, если оно есть).

+0

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

+0

@MatthewWatson - это нормально (для определенных значений «штраф») для двух независимых сборок, чтобы объявлять типы с идентичными полностью квалифицированными именами. Вот что ['extern alias'] (https://msdn.microsoft.com/en-us/library/ms173212.aspx) предназначено для решения проблемы. –

+0

@Damien_The_Unbeliever Да, но нет, если сборки имеют одинаковое имя DLL? Поэтому он должен будет переименовать его и использовать «extern alias». –

ответ

1

Вам необходимо assembly alias.

Установить псевдоним для сборки (в моем примере его sanford):

enter image description here

В коде:

extern alias sanford; 
using System; 
... 

event EventHandler<sanford::Sanford.StateMachineToolkit.Data> TransitionCompleted; 

Кроме того, вам нужно переименовать одну DLL-файл.

+1

Псевдонимы решают проблему компиляции, но не решают, что каталог 'bin' может содержать только один файл Lib2.dll, который, я думаю, является проблемой, которую пытается решить OP. –

+0

@Damien_The_Unbeliever, если я правильно помню, просто переименование должно помочь – Backs

+0

Немного подробней: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx –