InvalidCastException объекта Activator.CreateInstance во время процедуры установки - PullRequest
1 голос
/ 25 июня 2010

У меня есть следующая процедура

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 (...) внутри моего собственного переопределения Install (...):

public override void Install(IDictionary stateServer)

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

[RunInstaller(true)]
public class SpheresServiceInstaller : Installer

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

interface = (IMyInterface)myobject ;

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

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

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

Детали

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

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

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

1 Ответ

0 голосов
/ 25 июня 2010

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

переполнение стека: appdomain-createinstancefromandunwrap-невозможный-к-лить-прозрачный-прокси

ссылкачто дает нам код решения:

west-wind.com: Загрузка сборки через appdomain

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

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

Перейдите по ссылке west-winf, чтобы получить код, он отлично работает

...