Загрузка сборок в домен
От: Capitan_Blood  
Дата: 22.07.08 13:48
Оценка:
приветствую!
кратко ситуация:
есть следующая структура папок:
bin\ — тут лежит ехе
bin\plugins — тут лежат плагины
программа при загрузке сканит папку plugins и подгружает все найденные сборки...
в первой версии проги все грузилось в один домен с помощью Assembly.Load и все замечательно работало
во вторйо версии потребовалась выгрузка библиотек, поэтому пришлось использовать домены:
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = "plugins";
domainSetup.PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory;
domainSetup.ApplicationName = "FlashSVN";
domainSetup = AppDomain.CurrentDomain.SetupInformation;
pluginDomain = AppDomain.CreateDomain("PluginDomain", AppDomain.CurrentDomain.Evidence, domainSetup);
...
Assembly assembly = pluginDomain.Load(AssemblyName.GetAssemblyName(name).FullName);
на этой строке получаю эксепшен:
Could not load file or assembly 'bin\Debug\TestPlugin.dll' or one of its dependencies. The system cannot find the file specified.
бьюсь головой уже несколько дней, ничего пока не получилось, поэтому обращаюсь за советом)
Re: Загрузка сборок в домен
От: leonidvp Россия  
Дата: 22.07.08 14:51
Оценка:
Можно попробовать указывать полный путь при загрузке сборки
Re[2]: Загрузка сборок в домен
От: Capitan_Blood  
Дата: 22.07.08 15:02
Оценка:
Здравствуйте, leonidvp, Вы писали:

L>Можно попробовать указывать полный путь при загрузке сборки


пробывал, это было первое что попробывал — не помогло, результат тотже
Re: Загрузка сборок в домен
От: Alexandr Sulimov Украина www.ase.com.ua
Дата: 22.07.08 15:16
Оценка:
Здравствуйте, Capitan_Blood, Вы писали:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Re: Загрузка сборок в домен
От: Spiceman  
Дата: 22.07.08 15:16
Оценка:
Здравствуйте, Capitan_Blood, Вы писали:

C_B>бьюсь головой уже несколько дней, ничего пока не получилось, поэтому обращаюсь за советом)


Сначала значит
AppDomainSetup domainSetup = new AppDomainSetup();


а потом значит
domainSetup = AppDomain.CurrentDomain.SetupInformation;

Вот.
Re[2]: Загрузка сборок в домен
От: Spiceman  
Дата: 22.07.08 15:18
Оценка:
Здравствуйте, Spiceman, Вы писали:

S>Здравствуйте, Capitan_Blood, Вы писали:


C_B>>бьюсь головой уже несколько дней, ничего пока не получилось, поэтому обращаюсь за советом)


S>Сначала значит

S>
S>AppDomainSetup domainSetup = new AppDomainSetup();
S>


S>а потом значит

S>
S>domainSetup = AppDomain.CurrentDomain.SetupInformation;
S>

S>Вот.

Блин, сумбурно получилось. Короче, вы сначала создаете экземпляр AppDomainSetup, потом настраиваете его, а потом заменяете зачем-то настройками текущего домена.
Re[3]: Загрузка сборок в домен
От: Capitan_Blood  
Дата: 22.07.08 15:55
Оценка:
Здравствуйте, Spiceman, Вы писали:

S>Здравствуйте, Spiceman, Вы писали:


S>>Здравствуйте, Capitan_Blood, Вы писали:


C_B>>>бьюсь головой уже несколько дней, ничего пока не получилось, поэтому обращаюсь за советом)


S>>Сначала значит

S>>
S>>AppDomainSetup domainSetup = new AppDomainSetup();
S>>


S>>а потом значит

S>>
S>>domainSetup = AppDomain.CurrentDomain.SetupInformation;
S>>

S>>Вот.

S>Блин, сумбурно получилось. Короче, вы сначала создаете экземпляр AppDomainSetup, потом настраиваете его, а потом заменяете зачем-то настройками текущего домена.


упс, это просто код не тот вставил.. та мнету строчки приравнивания в общем)

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

pluginDomain.SetData("Plugin_AssemblyName", name);
pluginDomain.SetData("Plugin_application", application);

pluginDomain.DoCallBack(new CrossAppDomainDelegate(PluginManager.Load));

int pluginCount = (Int32)(pluginDomain.GetData("Plugin_TotalPlugin"));

for (int i = 0; i < pluginCount; i++)
{
Common.Plugin.BasePlugin plugin = (Common.Plugin.BasePlugin)pluginDomain.GetData("Plugin_Plugin" + i.ToString());
loadedPlugin.Add(plugin.Name, plugin);
}
...
private static Load()
{
int typeCount = 0;

String dName = (String)(AppDomain.CurrentDomain.GetData("Plugin_AssemblyName"));
Common.Plugin.IMainApp dApplication = (Common.Plugin.IMainApp)pluginDomain.GetData("Plugin_application");

Assembly assembly = Assembly.LoadFile(dName);

foreach (Type type in assembly.GetTypes())
{
if (type.BaseType == typeof(Common.Plugin.BasePlugin))
{
Common.Plugin.BasePlugin plugin = (Common.Plugin.BasePlugin)Activator.CreateInstance(type);
plugin.Init(dApplication);

foreach (Common.Plugin.Command command in plugin.Commands)
avalibleCommand.Add(command.Name, command);

AppDomain.CurrentDomain.SetData("Plugin_Plugin" + typeCount.ToString(), plugin);
typeCount++;
}
}

AppDomain.CurrentDomain.SetData("Plugin_TotalPlugin", typeCount);
}

теперь имеем ошибку
{System.Runtime.Serialization.SerializationException: Type is not resolved for member 'Test.TestPlugin,Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Для справки:
имеется следующая иерархия:
abstarct BasePlugin;
TestPlugin: BasePlugin
все классы помечены как серелизуемые
Re: Загрузка сборок в домен
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 22.07.08 16:23
Оценка:
Здравствуйте, Capitan_Blood, Вы писали:


C_B>domainSetup.ApplicationBase = "plugins";

C_B>domainSetup.PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory;

C_B>бьюсь головой уже несколько дней, ничего пока не получилось, поэтому обращаюсь за советом)


Вы перепутали ApplicationBase и PrivateBinPath — поменяйте значения местами.
Re[4]: Загрузка сборок в домен
От: Shtirliz Россия  
Дата: 23.07.08 07:23
Оценка:
Здравствуйте, Capitan_Blood, Вы писали:

C_B>теперь имеем ошибку

C_B>{System.Runtime.Serialization.SerializationException: Type is not resolved for member 'Test.TestPlugin,Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

C_B>Для справки:

C_B>имеется следующая иерархия:
C_B>abstarct BasePlugin;
C_B>TestPlugin: BasePlugin
C_B>все классы помечены как серелизуемые

Попробуй BasePlugin отнаследовать от MarshalByRefObject.
... << RSDN@Home 1.2.0 alpha 4 rev. 1083>>
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.