Почему мой C # AppDomain хорошо в один момент, а затем выдает исключения в следующий раз? - PullRequest
4 голосов
/ 24 июня 2010

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

class PluginLoader
{
    public static AppDomain PluginSandbox;

    static PluginLoader()
    {
        AppDomainSetup ads = new AppDomainSetup();
        ads.ApplicationName = "Plugin Modules";
        PermissionSet trustedLoadFromRemoteSourceGrantSet = 
                     new PermissionSet(PermissionState.Unrestricted);
        PluginSandbox = 
                     AppDomain.CreateDomain("Plugin App Domain", 
                     null, ads, trustedLoadFromRemoteSourceGrantSet);
     }

А потом я извлеку нужную DLL и создаю экземпляр объекта:

     public IPlugin FindPlugin(string pluginName)
     {
          ObjectHandle handle = 
                   PluginSandbox.CreateInstance(pluginName, 
                       "Plugins." + pluginName);
                IPlugin ip = (IPlugin)handle.Unwrap();
                return ip;
     }

Пропускаю пару раз без проблем.Получение экземпляров различных объектов в Песочнице без проблем.

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

     Assembly [] ar = PluginSandbox.GetAssemblies();

И выдается ошибка:

A first chance exception of type 'System.IO.FileNotFoundException' 
occurred in PluginRunner.dll.

Additional information: Could not load file or assembly '10wl4qso,
Version=1.0.3826.25439, culture info=neutral, PublicKeyToken=null'
or one of its dependencies.  The system cannot find the file specified.

Я не удивлен.'10wl4qso' не является названием сборки, dll или чем-то подобным.На самом деле это кажется псевдослучайным для каждого запуска.К тому же, дополнительное удовольствие от GetAssemblies даже не задокументировано, чтобы вызвать это исключение.

Теперь я могу вызвать GetAssemblies сразу после того, как я получаю начальный объект просто отлично, и все замечательно.Но через пару секунд другим способом я получаю это.Будучи удаленным, PluginSandbox не имеет никакой полезной информации в отладчике.

Я ловлю UnhandledException и DomainUnload на AppDomain, и ни один из них не запускается.

Почему мой AppDomain внезапно не знает оего сборки?Откуда эти данные мусора?Что я могу сделать, чтобы предотвратить то или другое?

Ответы [ 2 ]

2 голосов
/ 24 июня 2010

Эта странная именованная сборка, которую вы видите, вероятно, сгенерирована XmlSerializer. Сериализатор XML выведет динамическую сборку, чтобы можно было быстро сериализовать и десериализовать определенный тип. Проверьте ваш код на использование XmlSerializer, закомментируйте их и посмотрите, не возникнет ли проблема снова.

0 голосов
/ 10 июня 2013

Не знаю, поможет ли это вам ... Попробуйте переопределить InitializeLifeTimeService в IPlugin.Ваша реализация IPlugin должна сначала наследоваться от MarshalByRefObject.

public class PluginSample : MarshalByRefObject, IPlugin
{

   public overrides object InitializeLifetimeService()
   {
       return null; //Return null to infinite object remote life.
   }
  //...implementation

}

Взгляните на эту статью: RemotingException при возбуждении событий между доменами приложений

...