私はこの基本クラスを持っています:
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にキャストできません
したがって、質問は次のとおりです。派生クラスを基本クラスにキャストできないのはなぜですか。
ダイナミックライブラリをロードし、基本クラスのメソッドを使用してそれを「制御」する他の方法はありますか?