通过createInstance加载加载对象时出错

时间:2011-11-15 10:34:38

标签: c# casting createinstance

我有一个程序集,其中包含继承自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,Version = 1.0.4336.31676,Culture = neutral,PublicKeyToken = null

所以我不确定我做错了什么。我应该将ToBeProcessed更改为应用程序和插件中使用的接口(ItoBeProcessed)吗?然后有一个单独的程序集,它包含基本的ToBeProcessed类,根本不会被应用程序引用(只是by plugin)?

编辑:使用接口类解决了问题。我仍然不知道出了什么问题,但Kol的回答表明,理论上这应该是正确的。

3 个答案:

答案 0 :(得分:1)

有些人以前问过它 在stackoverflow How to get a Static property with Reflection

中查看了这个问题

答案 1 :(得分:1)

以下解决方案编译并运行时没有错误:

程序集#1:ToBeProcessed

编译为DLL,复制到c:\projectc:\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

答案 2 :(得分:0)

检查这个post它通过示例解释了反思。像继承的情况以及如何使用type.GetMethods (BindingFlags.LookupAll)来获取所有方法。