在.NET 4.0中断开的System.Reflection.Assembly.CreateInstance

时间:2011-01-16 20:29:59

标签: c# reflection .net-4.0

我们从.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定义。类似地,我有另一个继承自B类的C类,它对该方法有不同的定义。基本上重构以分享共同的逻辑。这在.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;
  }
}

2 个答案:

答案 0 :(得分:1)

使用Activator,它可以与使用以下平台(x86 / x64 /任何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    {        }
}

答案 1 :(得分:1)

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

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