プログラムにプラグインを追加しようとしていますが、DLLから正しいタイプをキャストできないことを除いて、これはうまく見えます。 私はそれに関するいくつかのプロジェクトの解決策を持っています。プロジェクトの 一つは、実際にCountryBaseを保持している国のレイヤであり、(パブリック抽象クラスCountryBaseのように定義:CountryLayers.ICountryBase) インタフェース(パブリックインターフェースICountryBase)私はのための「実装」を持っている別のプロジェクトで私のプログラムにDLLを動的にロードする際の問題
国。このDLLは、これを使用して、実行時にロードされます。
地方は地方公共クラスとして定義されたクラスの名前です Assembly assembly = Assembly.LoadFrom(file);
//get the class from the assembly
foreach (Type t in assembly.GetTypes())
{
//just for debugging
Console.WriteLine(t.FullName);
}
Type localType = assembly.GetType("CountryLayers.Local");
if (localType != null)
{
Country countrydata = new Country();
countrydata.ObjectType = localType;
countrydata.CountryObject = Activator.CreateInstance(localType);
countrydata.CountryObject2 = (CountryBase) countrydata.CountryObject;
countrydata.FileName = file;
CountryList.Add(countrydata);
}
:CountryLayers.CountryBase、CountryLayers.ICountryBase
countrydataはただのポインタを保持しています。 CountryObject2はCountryBaseとして定義されています(私もIcountryBaseとして試しました)。しかし、それは常にタイプが転換可能ではないことを返しました。
コンソールライトラインでは、アセンブリ内にcountrylayerに属するすべてのクラスとローカルクラスがロードされていることがわかりました。
だから私は同じ解決策のすべてを持っているためにエラーかどうか分かりませんし、問題はインターフェイスと抽象クラスを悪い順序で使用していることです。また、create instanceがオブジェクトを返すとき、そのオブジェクトは抽象クラスで定義されたすべてのプロパティを持ちますが、メソッドはありません。
しかし、私は今、デバッグとテストのために同じソリューション上にすべてを持っています..(同じソリューション、それぞれ異なるプロジェクト) ... – gbianchi