2015-08-04 7 views
0

Я пытаюсь загрузить старую версию DLL Farpoint в моем проекте, используя ниже кодне в состоянии создать объект с Activator.CreateInstance

 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(); 

ответ

1

Они доступны, но только не во время компиляции. 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); 
+0

Я не могу отдать его объекту Farpoint - причина в том, что у меня есть 2 версии Farpoint dll. Последняя версия, которую я использую в своем проекте и более старой версии, я имею в виду. Поэтому, если я привожу в Farpoint, он автоматически преобразует его в последнюю версию, но мне нужна старая версия –

+0

Добавьте обе ссылки с разными псевдонимами. –

1

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

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

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

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

Кстати, будьте осторожны, используя Assembly.LoadFile. Вы можете получить более подробную информацию об этом article.

+0

Я получаю ниже сообщение об ошибке, когда я использовал динамический - не удалось загрузить файл или сборку «FarPoint.Web.Chart, Version = 5.0.3515.2008, Culture = нейтраль или одна из его зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. –

+0

@ Coder2014, как исключение messaeg говорит, что ваша загруженная сборка зависит от «FarPoint.Web.Chart». Поэтому вы должны загрузить его также, потому что 'LoadFile' не будет автоматически решать зависимости загрузки загрузочной сборки. Быстрый googling дал мне, что [ссылка] (http://stackoverflow.com/questions/22967928/loading-dependent-assemblies-manually), которая описывает аналогичную проблему. (Прежде чем добавлять еще один пример на этот сайт, попробуйте сами решить проблему. Постарайтесь.) – Vladislav