2009-05-07 8 views
2

プログラムにプラグインを追加しようとしていますが、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がオブジェクトを返すとき、そのオブジェクトは抽象クラスで定義されたすべてのプロパティを持ちますが、メソッドはありません。

答えて

1

私はそれを自分で解決します。問題は、ソリューションを使用してすべてをコンパイルするときに発生します。こうすることで、他のクラスの出力にもインターフェイス用のDLLが作成されます。そのことを念頭に置いて、私はプラグインを保持するためのプラグインフォルダを使用していました。そして、そのフォルダへの出力をコンパイルするようにVSを設定しました。それはインターフェイスdllと抽象実装dllと共に、派生クラスをそのフォルダにコピーします。コンパイラを混乱させました。私はVSのプロジェクトのすべてのリファレンスを取り出します(コンパイル済みのdllを参照するように変更します)、すべてのdllを単独でコンパイルしてから、必要なDLLをプラグインフォルダにコピーして作業します。 とにかくこのリンクは私に問題のヒントを教えてくれました: Dynamic Loading with Reflection

0

あなたが動的にロードしたdllが、基本クラスを含むdllの別のバージョンを参照していたとき、私は過去に似たような状況に遭遇しました(あなたのケースではCountryBase)。

+0

しかし、私は今、デバッグとテストのために同じソリューション上にすべてを持っています..(同じソリューション、それぞれ異なるプロジェクト) ... – gbianchi

関連する問題