2010-06-25 2 views
1

У меня есть следующая процедураInvalidCastException объекта Activator.CreateInstance во время процедуры установки

private static IMyInterface OpenInstance( 
string assemblyPath, 
string classType, 
string assemblyName, 
out AppDomain domainInstall) 
{ 
    IMyInterface interface = null; 

    AppDomainSetup domaininfo = new AppDomainSetup(); 

    domaininfo.ApplicationBase = assemblyPath; 
    domainInstall = AppDomain.CreateDomain("PathInstall", null, domaininfo); 

    ObjectHandle handleService = null; 
    try 
    { 

     handleService = Activator.CreateInstance(
     domainInstall, 
     assemblyName, 
     classType, 
     true, 
     System.Reflection.BindingFlags.CreateInstance, 
     null, 
     new Object[] { assemblyName}, 
     System.Globalization.CultureInfo.CurrentCulture, 
     null, null); 

     Object myobject = handleService.Unwrap(); 
     interface = (IMyInterface)myobject ; 
    } 
    catch (Exception ex) 
    { 
     ... 
    } 

    return interface ; 
} 

Эта процедура работает всегда хорошо, но когда она вызывается во время установки пользовательских действий.

Другими словами, если я называю мою процедуру OpenInstance (...) внутри моей установки (...) переопределение:

public override void Install(IDictionary stateServer) 

Определено в моем монтажника расширенном классе:

[RunInstaller(true)] 
public class SpheresServiceInstaller : Installer 

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

interface = (IMyInterface)myobject ; 

Сведения об исключении:

  • Тип: System.InvalidCastException
  • Сообщение: Невозможно бросить прозрачный прокси типа 'IMyInterface'.

Я хотел бы понять, почему процедура работает всегда, но в этом конкретном случае.

Подробности

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

  • Сборка, которая используется Activator.CreateInstance, уже существует в файловой системе.

  • Специфическое собрание 'assemblyName в исходном коде - это сервис окна, который только что был создан процедурой установки.

ответ

0

Я решил проблему, перейдя по ссылке, предложенной на этом посту

stack overflow: appdomain-createinstancefromandunwrap-unable-to-cast-transparent-proxy

Ссылка, которая дает нам код решение является

west-wind.com: Assembly Loading across appdomain

Это действительно основной вещь, я был взломан в случае, когда сборка загружается внешним приложением (в моем конкретном случае: установщик wow64 заявление).

Приложение не знает, где найти сборки, зависящие от основной сборки, которую вы загружаете, поэтому вам необходимо написать собственный преобразователь для текущего домена приложения (в моем конкретном случае: приложение-установщик wow64) в чтобы предоставить в нем необходимую загружаемую информацию.

Направляйтесь на запад-winf, чтобы получить код, он отлично работает

Смежные вопросы