0

ToBeProcessed から継承するクラス RD_ToBeProcessed を含むアセンブリがあります。クラスは別々のアセンブリにあります。

createInstance を使用してオブジェクトをロードし、次のコードでキャストを試みます。

    private Type tbpType = null;
    public ToBeProcessed getToBeProcessedObject(string data)
    {
        // The data is passed in so that the fields are populated with the
        // correct data.
        if (tbpType==null){
            Assembly assembly = 
                Assembly.LoadFrom("c:\\project\\RD_ToBeProcessed.dll");
            tbpType = assembly.GetType("myNameSpace.RD_ToBeProcessed");
        }
        Object tbp = Activator.CreateInstance(tbpType,data);
                    // This line throws an error
        return (ToBeProcessed)tbp;
    }

これは、質問 .NET: Unable to cast object to interface it implementsの繰り返しですが、解決方法がわかりません。

スローされるエラーは

タイプ「myNameSpace.RD_ToBeProcessed」のオブジェクトをタイプ「myNameSpace.ToBeProcessed」にキャストできません。

受け入れられた回答は、問題がベース アセンブリの 2 つの異なるバージョンにあることを示していました。しかし、ILSpy と、アプリケーション ディレクトリ内の ToBeProcessed dll と、RD_ToBeProcessed レポートと同じディレクトリ内の dll の両方を使用しました。

ToBeProcessed、バージョン = 1.0.4336.31676、カルチャ = ニュートラル、PublicKeyToken = null

だから私は何が間違っているのか分かりません。ToBeProcessed をアプリとプラグインで使用されるインターフェイス (ItoBeProcessed) に変更する必要がありますか? 次に、アプリケーションによってまったく参照されない (プラグインによってのみ) ベースの ToBeProcessed クラスを保持する別のアセンブリがありますか?

編集: インターフェイス クラスを使用して問題を解決しました。何がうまくいかなかったのかはまだわかりませんが、Kolの答えは、理論的にはこれが正しく機能するはずだったことを示しています。

4

3 に答える 3

1

次のソリューションは、エラーなしでコンパイルおよび実行されます。

アセンブリ#1:ToBeProcessed

c:\projectとにコピーされるDLLにコンパイルされますc:\project\test。System.dllを参照します。ToBeProcessed.cs:

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.*")]

namespace myNameSpace
{
  public class ToBeProcessed
  {
    protected string data;
    public ToBeProcessed() { }
    public string Process() { return data.ToUpper(); }
  }
}

アセンブリ#2:RD_ToBeProcessed

にコピーされるDLLにコンパイルされますc:\project。System.dllおよびToBeProcessed.dllを参照します。RD_ToBeProcessed.cs:

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.*")]

namespace myNameSpace
{
  public class RD_ToBeProcessed : ToBeProcessed
  {
    public RD_ToBeProcessed(string data) { this.data = data; }
  }
}

アセンブリ#3:ToBeProcessedTest

にコピーされるEXEにコンパイルされc:\project\testます。System.dllおよびToBeProcessed.dllを参照します。ToBeProcessedTest.cs:

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.*")]

namespace myNameSpace
{
  class ToBeProcessedTest
  {
    private Type tbpType = null;
    public ToBeProcessed getToBeProcessedObject(string data)
    {
      if (tbpType == null)
      {
        Assembly assembly = Assembly.LoadFrom("c:\\project\\RD_ToBeProcessed.dll");
        tbpType = assembly.GetType("myNameSpace.RD_ToBeProcessed");
      }
      Object tbp = Activator.CreateInstance(tbpType, data);
      return (ToBeProcessed)tbp;
    }

    public static void Main()
    {
      ToBeProcessedTest test = new ToBeProcessedTest();
      ToBeProcessed tbp1 = test.getToBeProcessedObject("myData1");
      Console.WriteLine(tbp1.Process());
      ToBeProcessed tbp2 = test.getToBeProcessedObject("myData2");
      Console.WriteLine(tbp2.Process());
      Console.ReadKey(true);
    }
  }
}

出力:

MYDATA1
MYDATA2
于 2011-11-15T12:04:30.187 に答える
1

一部の人々は、スタックオーバーフローでこの質問を確認する前にそれを尋ねましたリフレクションで静的プロパティを取得する方法

于 2011-11-15T10:41:04.303 に答える
0

この投稿を確認してください。例を挙げてリフレクションについて説明しています。継承のケースと、type.GetMethods (BindingFlags.LookupAll) すべてのメソッドを取得するための使用方法など。

于 2011-11-15T10:42:12.247 に答える