【问题标题】:System.Refelection.Assembly.CreateInstance broken in .NET 4.0System.Refelection.Assembly.CreateInstance 在 .NET 4.0 中损坏
【发布时间】:2012-10-29 11:46:13
【问题描述】:

我们从 .NET 3.5 升级到 .NET 4.0,现在 System.Refelection.Assembly.CreateInstance 似乎无法正常工作。有没有其他人有这个问题?有没有办法解决它?下面是我们如何加载程序集的示例。它返回一个空值。没有例外。它是在 GAC 中注册的 .NET 程序集。它不是 COM 对象。

Assembly assembly = Assembly.LoadWithPartialName("AssemblyName");
object instance = assembly.CreateInstance("Namespace.Class",
                        false,
                        BindingFlags.CreateInstance,
                        null,
                        null, null, null);

我缩小了问题的原因。我正在尝试创建的 A 类继承自 B 类。B 类被定义为公共抽象类 B。B 类包含大部分逻辑以及 A 类定义的一种抽象方法。同样,我有另一个类 C,它继承自 B 类,它对该方法有不同的定义。基本上重构以共享通用逻辑。这在 .NET 3.5 中有效,但在 .NET 4.0 中,我最终将异常范围缩小为“{”无法创建抽象类。“}”。

public abstract class A
{
  public string InvokeUI() 
  {
    //some logic
    DisplayUI();
  }

  protected abstract void DisplayUI();
}

public class B : A
{
  protected override DisplayUI()
  {
    Some logic;
  }
}

【问题讨论】:

标签: c# reflection .net-4.0


【解决方案1】:

使用 Activator,它可以很好地与使用以下平台(x86/x64/Any CPU)编译的 .net Framework 4.0 配合使用:

using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var ass = Assembly.Load("ConsoleApplication1");
            var type = ass.GetType("ConsoleApplication1.Test");
            var obj = Activator.CreateInstance(type);
            Console.ReadLine();


        }
    }

    public class Test    {        }
}

【讨论】:

    【解决方案2】:

    您必须使用fusion.dll 库来读取GAC。找到“完整程序集名称”后,您可以使用 Reflection.[Assembly].Load() 而不是 Reflection.[Assembly].LoadWithPartialName()。有我写的文章解释了需要做什么:

    http://www.codeproject.com/Articles/485145/Late-Binding-to-NET-objects-in-NET-4-0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多