не удалось создать объект с помощью Activator.CreateInstance

Я пытаюсь загрузить старую версию dll farpoint в свой проект, используя приведенный ниже код.

     System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(@"FarPoint.Web.Spread.dll");
    System.Type MyDLLFormType = assembly.GetType("FarPoint.Web.Spread.FpSpread");
    var c = Activator.CreateInstance(MyDLLFormType);

Проблема в том, что после создания экземпляра все доступные методы Farpoint недоступны [например, если я создаю объект напрямую, такие методы, как saveExcel или savechanges, доступны с экземпляром]

                FpSpread fpProxyObject = new FpSpread();
                fpProxyObject.SaveExcel();

person Code's    schedule 04.08.2015    source источник


Ответы (2)


Они доступны, но не во время компиляции. Activator.CreateInstance() возвращает object. Конечно, вы могли бы привести объект:

var c = Activator.CreateInstance(...)
FpSpread fpProxyObject = (FpSpread)c;

Но это, вероятно, превзошло бы всю цель использования отражения для создания экземпляра.

Вы можете получить доступ ко всем членам объекта результата, используя отражение, то есть:

MethodInfo saveExcelMethod = c.GetType().GetMethod("SaveExcel");
if (saveExcelMethod == null) throw new ApplicationException("Incorrect version of FarPoint");
saveExcelMethod.Invoke(c);
person C.Evenhuis    schedule 04.08.2015
comment
Я не могу привести его к объекту Farpoint - причина в том, что у меня есть 2 версии dll Farpoint - последняя, ​​которую я использую в своем проекте, и более старая версия, на которую я ссылаюсь. Так что, если я приведу тип к Farpoint - он автоматически конвертирует его в последнюю версию - но мне нужна старая версия - person Code's; 04.08.2015
comment
Добавьте обе ссылки с разными псевдонимами. - person Adriano Repetti; 04.08.2015

Intellisense не работает, потому что, как сказал @C.Evenhuis, Activator.CreateInstance возвращает object, поэтому вы должны привести его к соответствующему типу.

Если тип неизвестен во время компиляции, но у вас есть доступ к базе кода, вы можете попробовать добавить для него интерфейс и реализовать его своим классом. Затем приведите объект к этому интерфейсу и используйте его. (Я не знаю вашей цели, но интерфейс можно рассматривать как контракт для всех типов, которые вы будете загружать динамически).

Если тип неизвестен во время компиляции и у вас нет доступа к базе кода, вы можете использовать отражение для вызова метода или вместо этого использовать dynamic.

dynamic c = Activator.CreateInstance(MyDLLFormType);
c.SaveExcel(); // this method invocation will be bound in runtime.

Кстати, будьте осторожны при использовании Assembly.LoadFile. Дополнительные сведения можно получить из этой статьи< /а>.

person Uladzislau    schedule 04.08.2015