3

私はこの基本クラスを持っています:

namespace DynamicGunsGallery
{
    public class Module
    {
        protected string name;

        public virtual string GetName() { return name; }
        public virtual string GetInfo() { return null;  }
    }
}

そして、基本クラスから継承するダイナミックライブラリを作成しています(例:(AK47.dll))

namespace DynamicGunsGallery
{
    public class AK47 : Module
    {
        public AK47() { name = "AK47";  }

        public override string GetInfo()
        { 
            return @"The AK-47 is a selective-fire, gas-operated 7.62×39mm assault rifle, first developed in the USSR by Mikhail Kalashnikov.
                    It is officially known as Avtomat Kalashnikova . It is also known as a Kalashnikov, an AK, or in Russian slang, Kalash.";
        }
    }
}

これを使用してダイナミックライブラリをロードしています(このリンクに触発されています):

namespace DynamicGunsGallery
{
    public static class ModulesManager
    {
        public static Module getInstance(String fileName)
        {
            /* Load in the assembly. */
            Assembly moduleAssembly = Assembly.LoadFile(fileName);

            /* Get the types of classes that are in this assembly. */
            Type[] types = moduleAssembly.GetTypes();

            /* Loop through the types in the assembly until we find
             * a class that implements a Module.
             */
            foreach (Type type in types)
            {
                if (type.BaseType.FullName == "DynamicGunsGallery.Module")
                {
                    //
                    // Exception throwing on next line !
                    //
                    return (Module)Activator.CreateInstance(type);
                }
            }

            return null;
        }
    }
}

ModuleManagerを含む実行可能ファイルとdllライブラリの両方に基本クラスを含めました。コンパイル時に問題はありませんが、このコードを実行するとエラーが発生します。

InvalidCastExceptionは処理されませんでした。

タイプDynamicGunsGallery.AK47のオブジェクトをタイプDynamicGunsGallery.Moduleにキャストできません

したがって、質問は次のとおりです。派生クラスを基本クラスにキャストできないのはなぜですか。

ダイナミックライブラリをロードし、基本クラスのメソッドを使用してそれを「制御」する他の方法はありますか?

4

1 に答える 1

3

あなたのコメントから:

サブライブラリでは、モジュールを再宣言することはできません。元のライブラリからモジュールを参照する必要があります。

akクラスを含むプロジェクトからメインプロジェクトへの参照を追加します。

また、名前空間を変更して、2つのライブラリが実行されていることを明確にすることも考えます。

于 2013-02-10T12:00:51.817 に答える