2014-02-26 3 views
1

Это странно ... может быть.Возможно ли ссылаться на две разные сборки с тем же именем в проекте? разные двоичные файлы

Реферат: Я использую 32-битные библиотеки для связи с Bluetooth. У нас есть общий код, который работает как на .Net compact (для мобильных устройств), так и на стандартах. Сеть.

Я ищу внушительное решение или какой-либо шаблон дизайна, который может существовать, о котором я не знаю.

32feet предлагает один сборник для компактного каркаса и один для стандартного. Ассембли имеют одно и то же имя, одинаковые имена классов.

Мне нужно найти решение, в котором у меня есть общий класс, который любой может потреблять, который будет знать, как соединяется. Я даже не уверен, что это возможно. Решение im, наклоняющееся к настоящему времени, состоит из двух отдельных сборок ... Один для мобильных устройств. .. Один для стандарта. Это не так, и мне интересно, есть ли лучший путь. Можно ли использовать такой тип DI для выбора правильного двоичного файла во время выполнения?

Пример: Открытый аннотация BluetoothBase { Public BluetoothBase() { }

 Public int Connect() 
    { 
      // this is where problem lies. Need to tell class which assembly to use based on OS. So far I'm finding this is not possible. .. 

    } 
+0

Что происходит, когда вы пытаетесь добавить как в VS к вашему проект? Вы получаете какие-либо ошибки, и если да, то что говорят? Кроме того, как насчет загрузки сборок динамически во время выполнения, где вы загружаете только один из них в зависимости от ОС, а затем вызываете их? – LB2

+0

Lb22 благодарит за ваш ответ. Я могу, например, добавить оба, если переименовать один. Проблема заключается в том, что обе сборки имеют одинаковые имена классов внутри. Например, var btc = new BluetoothClient() - это тот же вызов для обеих сборок. В идеале ... Я хотел бы сделать именно то, что вы сказали ... ссылайтесь на каждую сборку отдельно на основе os. Это просто факт, что обе сборки, похоже, содержат одни и те же пространства имен, одни и те же имена классов, такие же подписи конструктора и т. Д. – tronious

+0

Может ли альтернатива extern решить эту проблему? Похоже, может. Я обновлю этот поток, если он будет – tronious

ответ

1

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

Определите интерфейс в общем коде.

public interface IBluetooth 
{ 
    //methods you need from the base class. 
} 

мобильной платформы конкретного кода

public class MobileBluetooth : IBluetooth 
{ 
//Implement 
} 

В настольной платформе специальный код

public class DesktopBlueooth : IBluetooth 
{ 
    //Implement 
} 

И для рамок или BLUETOOTH система базового класса есть метод инициализации, где вы впрыснуть в вашем интерфейс.

public abstract BluetoothBase 
{ 
    private IBluetooth _connection; 

    public Init(IBluetooth connection) 
    { 
     _connection = connection; 
    } 

    public int Connect() 
    { 
     //use the interface to connect. 
    } 
} 
+0

Мне это нравится! Простой и понятный. Я попробую это завтра, когда я получу работу и соглашусь, что это будет соответствовать законопроекту. Спасибо за ваше время! – tronious

0

Короче говоря, самый простой способ сделать это состоит в следующем:

У вас есть два узла с одинаковыми названиями, одни и те же типы классов, так же все. Только разница? Я мой случай один был составлен для рабочего стола, а другой был составлен для компактной структуры

Я в этом случае узлы называются InTheHand.Personal.Net

Самый простой подход, чтобы сделать следующее:

  1. Скопируйте каждую соответствующую сборку в ее собственную папку.
  2. В визуальной студии щелкните правой кнопкой мыши по вашему проекту и выберите «выгрузить проект». Это необходимо, потому что диспетчер ссылок не позволит вам добавить две сборки с тем же именем. Чтобы обойти это, вы вручную редактируете файл проекта.

  3. Добавить два ссылочных элемента в три эталонных раздела. Каждый из них указывает на расположение пути к dll.

  4. Дайте каждому. Dll - собственный псевдоним.

Код в коде, используйте директиву extern alias для ссылки на каждую сборку.

Если вы делаете мобильный против nonmobile, как я, завернуть каждый в директиве #if PocketPC

Затем создайте используя псевдоним каждого

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