运行时访问库管理程序类?

时间:2013-11-07 18:02:04

标签: c++ reflection dll static-libraries

我有一些应用程序和静态库的C ++解决方案:

  • 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包括描述汽车部件(车身,车轮,发动机等)的类。每个类都实现了一些在Garage lib中描述的接口(IBody,IWheels,IEngine等)。而Garage.lib应该使用零件来制造汽车。

因此,我将汽车参数传递给应用程序,例如:-Car1 -RedBody -MiddleWheels -V8Engine -RaceTires -Car2 -BlueBody -SmallWheels -V12Engine -WinterTires。应用程序调用Garage类:Garage :: GetCar(字符串体,字符串轮,字符串引擎,字符串轮胎)和车库返回Car对象,我们在app中使用。请注意,我将这些参数传递给字符串。这很重要。

现在,关于我想要什么。我只写了Garage lib。其他libs将由其他人写。我希望我的图书馆已经普及。此时,当添加新部件(例如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 个答案:

答案 0 :(得分:1)

您可以使用DLL完全“动态”解决方案,前提是:

  1. 您可以从字符串'“BlackBody”中获取Dll名称(“BlackBody.dll”))
  2. 每个Dll导出一个工厂函数,具有可预测的名称(“Factory”或“BlackBodyFactory”)
  3. 您动态加载Dll,并通过GetProcAddress获取工厂指针功能
  4. 您的Garage.lib代码只知道Body基类,因为这是“body”工厂函数将返回的内容
  5. 您应避免在同一过程中混合使用不同的CRT。混合是可能的,但需要额外的照顾/工作。