1

いくつかのアプリと静的ライブラリを使用した 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

アプリケーションでは、レースごとに 1 つのアプリケーションをシミュレートするだけです。ライブラリは、車のパーツ (ボディ、ホイール、エンジンなど) を記述するクラスで構成されます。すべてのクラスは、Garage lib. また、Garage.lib はパーツを使用して車を作成する必要があります。

したがって、車のパラメーターをアプリケーションに渡します。例: -Car1 -RedBody -MiddleWheels -V8Engine -RaceTires -Car2 -BlueBody -SmallWheels -V12Engine -WinterTires 。アプリケーション呼び出し Garage クラス: 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を使用する必要がありますか? これは唯一の方法ですか?もしそうなら、アプリケーションと dll が 1 つのライブラリ (Garage.lib) を使用することに問題はありますか? 異なるランタイム ライブラリ (/MT と /MD) を使用しているためです。

4

1 に答える 1

1

次の条件を満たしていれば、DLL を使用して完全に「動的」なソリューションを作成できます。

  1. 文字列 '"BlackBody" から Dll 名 ("BlackBody.dll") を派生させることができます)
  2. 各 Dll は、予測可能な名前 (「Factory」または「BlackBodyFactory」) を持つファクトリ関数をエクスポートします。
  3. Dll を動的にロードし、GetProcAddress を介してファクトリ ポインター関数を取得します。
  4. Garage.lib コードは Body 基底クラスについてのみ認識します。これは、「body」ファクトリ関数が返すものであるためです。

同じプロセスで異なる CRT を混在させることは避けてください。混合は可能ですが、特別な注意/作業が必要です。

于 2013-11-08T13:55:12.483 に答える