2013-11-07 2 views
1

У меня есть C++ решение некоторых приложений и статических библиотек:Runtime доступ к библиотечным классам?

  • UserRace1.exe
  • UserRace2.exe
  • GreenBody.lib
  • BlueBody.lib
  • RedBody.lib
  • BigWheels .lib
  • MiddleWheels.lib
  • SmallWheels.lib
  • V8Engine.lib
  • V12Engine.lib
  • RaceTires.lib
  • WinterTires.lib
  • SimpleTires.lib
  • Garage.lib

В приложении, я просто имитировать гонку, одно приложение для каждой гонки. Libs состоят из классов, которые описывают части автомобиля (тело, колеса, двигатель и т. Д.). Каждый класс реализует некоторый интерфейс (IBody, IWheels, IEngine и т. Д.), Описанный в Garage lib. И Garage.lib должен создавать автомобили, используя детали.

Итак, я передаю параметры автомобиля для применения, например: -Car1 -RedBody -MiddleWheels -V8Engine -RaceTires -Car2 -BlueBody -SmallWheels -V12Engine -WinterTires. Заявка на вызов Класс гаража: Garage :: GetCar (строковое тело, струнные колеса, струнный двигатель, строковые шины) и возврат гаража. Автомобильный объект, который мы используем в приложении. Обратите внимание, что я передаю эти аргументы как строку. Это важно.

Теперь о том, чего я хочу. Я пишу только Garage lib. Другие библиотеки будут пишут другие люди. И я хочу, чтобы моя библиотека была универсальной. В этот момент, когда добавлена ​​новая часть (например, BlackBody.lib), я должен добавить поддержку этого в свой Garage.lib. что-то вроде:

... 
else if (body == "RedBody") 
{ 
    car->body = new RedBody(); 
} 
else if (body == "BlackBody") 
{ 
    car->body = new BlackBody(); 
} 
... 

Но я хочу, чтобы эти типы были динамически. Нравится:

foreach (Librarian lib in Application.GetLibs()) 
{ 
    foreach (Type type in lib) 
    { 
     if (type is IBody) 
     { 
      if (((IBody)type)::GetColor() == color) 
      { 
       car->body = type.GetInstance(); 
       return; 
      } 
     } 
    } 
} 

Тогда, если кто-то добавит новый тип, я не изменю свою библиотеку. Проблема в том, что я пишу на C++, а не на C#. И я не знаю, как его реализовать.

Может быть, я должен использовать dll вместо статического lib? Это единственный способ? И если да, будут ли проблемы, связанные с тем, что приложения и библиотеки DLL используют одну библиотеку (Garage.lib)? Потому что они используют разные библиотеки времени выполнения (/ MT и/MD).

+1

Вы можете использовать фабричный класс для типов для каждой библиотеки, и вам нужно будет только зарегистрировать фабрики в EXE. – Raxvan

ответ

1

Вы могли бы полностью "динамический" решение, с помощью библиотеки DLL, при условии, что:

  1. вы можете получить имя Dll ("BlackBody.dll") из строки «чернотельный")
  2. каждая Dll экспортирует заводскую функцию с предсказуемым именем («Factory» или «BlackBodyFactory»)
  3. Вы динамически загружаете Dll и получаете функцию указателя фабрики через GetProcAddress
  4. Ваш гараж.lib code знает только о базовом классе Body, потому что это то, что возвратит заводская функция тела.

Вам следует избегать смешивания разных ЭЛТ в том же процессе. Смешивание возможно, но требует дополнительной заботы/работы.

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