У меня есть 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).
Вы можете использовать фабричный класс для типов для каждой библиотеки, и вам нужно будет только зарегистрировать фабрики в EXE. – Raxvan