System.Refelection.Assembly.CreateInstance не работает в .NET 4.0 - PullRequest
3 голосов
/ 16 января 2011

Мы обновились с .NET 3.5 до .NET 4.0, и теперь System.Refelection.Assembly.CreateInstance, похоже, не работает. У кого-нибудь еще возникла такая проблема? Есть ли способ это исправить? Ниже приведен пример того, как мы загружаем сборку. Возвращает нулевое значение. Не исключение Это сборка .NET, зарегистрированная в GAC. Это не 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;
  }
}

Ответы [ 2 ]

1 голос
/ 29 октября 2012

Вы должны использовать библиотеку fusion.dll, чтобы прочитать GAC. Найдя «Полное имя сборки», вы можете использовать Reflection.[Assembly].Load() вместо Reflection.[Assembly].LoadWithPartialName(). Я написал статью, в которой объясняется, что нужно сделать:

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

1 голос
/ 17 января 2011

С Активатором он отлично работает с .net Framework 4.0, скомпилированной со следующими платформами (x86 / x64 / Любой ЦП):

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    {        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...