Вызов методов из другого процесса
Что мне делаааать...ПАМАГИТЕ!
Я осуществляю взаимодействие между работающим дот нетовским приложением и дот нетовкой же длл-кой которую юзают скрипты виставского Сайд Бара как актив икс обьект регистрируя его в реестре при первом запуске скрипта....
По сути - это проблема поддержки приложением вистовских гаджетов....но попрашу заметить - на Локальной машине.
Можно конечно ввести ограничение на ТиСиПи...но...
Использовать его для взаимодействия между процессами на одном компе концептуально неверно....
В дот нете осуществлять взаимодействие через пайп не намного сложнее чем через тисипи...классов пално...
Если вышеописанная проблема по вашему мнению не имеет решения что более чем вероятно....вы могли бы аргументированно высказать свою точку зрения чем сэкономите мне кучу времени...Буд очень благадарен....
Использование доменов приложений не даёт решения - они нужны видимо лишь для ускорения работы приложения....
Ктонить ляпните чонить умное ради боже спасите беднава юзвера....
[SIZE=2][FONT=Courier New]{[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff] public[/COLOR][/SIZE][SIZE=2] MyRefClass([/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] str)[/FONT][/SIZE]
[SIZE=2][FONT=Courier New] {[/FONT][/SIZE]
[SIZE=2][FONT=Courier New] }[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]}[/FONT][/SIZE]
Далее создаём домен и в нём экземпляр этого класса:
[FONT=Courier New][SIZE=2][COLOR=#008080]Type[/COLOR][/SIZE][SIZE=2] t = [/SIZE][SIZE=2][COLOR=#0000ff]typeof[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]MyRefClass[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]);[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]newDomain.CreateInstanceAndUnwrap(t.Assembly.FullName, t.FullName, [/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]false[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New],[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]System.Reflection.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]BindingFlags[/COLOR][/SIZE][SIZE=2].CreateInstance, [/SIZE][SIZE=2][COLOR=#0000ff]null[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New],[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]object[/COLOR][/SIZE][SIZE=2][] { [/SIZE][SIZE=2][COLOR=#800000]"Hello, world!"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] },[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]System.Globalization.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]CultureInfo[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].CurrentCulture,[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff]null[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New],[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#008080]AppDomain[/COLOR][/SIZE][SIZE=2].CurrentDomain.Evidence);[/SIZE][/FONT]
[SIZE=2][FONT=Courier New]{[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff] public[/COLOR][/SIZE][SIZE=2] MyRefClass([/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] str)[/FONT][/SIZE]
[SIZE=2][FONT=Courier New] {[/FONT][/SIZE]
[SIZE=2][FONT=Courier New] }[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]}[/FONT][/SIZE]
Далее создаём домен и в нём экземпляр этого класса:
[FONT=Courier New][SIZE=2][COLOR=#008080]Type[/COLOR][/SIZE][SIZE=2] t = [/SIZE][SIZE=2][COLOR=#0000ff]typeof[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]MyRefClass[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]);[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]newDomain.CreateInstanceAndUnwrap(t.Assembly.FullName, t.FullName, [/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]false[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New],[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]System.Reflection.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]BindingFlags[/COLOR][/SIZE][SIZE=2].CreateInstance, [/SIZE][SIZE=2][COLOR=#0000ff]null[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New],[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]object[/COLOR][/SIZE][SIZE=2][] { [/SIZE][SIZE=2][COLOR=#800000]"Hello, world!"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] },[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]System.Globalization.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]CultureInfo[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].CurrentCulture,[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff]null[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New],[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#008080]AppDomain[/COLOR][/SIZE][SIZE=2].CurrentDomain.Evidence);[/SIZE][/FONT]
да да это то понятно,а если к примеру в классе MyRefClass есть метод,ну нпаример
Control GetSomeControl(void)
{
Form1 frm=new Form1();
return frm;
}
затем если использовать такой подход как ты описал,то возвращяемый класс Control не будет валиден... так вот как зделать так чтобы в данном подходи при возвращении любого класса он был валиден?
1. есть библиотека класса содержащяя 1 интерфей(Plugin.dll)
{
public class S_PLUGIN_INIT:MarshalByRefObject
{
public string sPluginName;//out
}
public interface IPluginInterface
{
S_PLUGIN_INIT OnLoad(string sVersion);//on load module
void OnUnLoad();//on unload module
void OnShow(out Object ctrl);//on show form
void OnHide();//on hide form
}
public class PluginInterfaceFactory : MarshalByRefObject
{
private const BindingFlags bfi = BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance;
public PluginInterfaceFactory() { }
public IPluginInterface Create(string assemblyFile, string typeName, object[] constructArgs)
{
return (IPluginInterface)Activator.CreateInstanceFrom(
assemblyFile, typeName, false, bfi, null, constructArgs,
null, null, null).Unwrap();
}
}
}
2. имеем библиотеку классов(Client.dll) которая подключает к референс верхнюю библиотеку (Plugin.dll) и содержит имплементацию интерфеса PluginInterface. и дополнительно 1 окно Form Form1;
{
public class PIPluginClass : MarshalByRefObject, IPluginInterface
{
#region IPIPlugin Members
S_PLUGIN_INIT OnLoad(string sVersion)
{
}
public void OnUnLoad()
{
throw new Exception("The method or operation is not implemented.");
}
public void OnShow(out System.Windows.Forms.Control ctrl)//on show form
{
Form frm = new Form1();
frm.Visible = true;
frm.TopLevel = false;
ctrl = frm;
}
public void OnHide()
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
}
3. Имеем испонимый файл (Server.exe) которая подключает к референс верхнюю библиотеку (Plugin.dll), и должен динамически подгрузить Client.dll и использовать класс формы которая есть в этой длл
//// create the factory class in the secondary app-domain
PluginInterfaceFactory factory = (PluginInterfaceFactory)ap.CreateInstance("PluginInteraface", "PluginInterface.PluginInterfaceFactory").Unwrap();
// with the help of this factory, we can now create a real 'PluginInterface' instance
object[] constructArgs = null;// new object[] { "" };
PluginInterfaceFactory factory = (PluginInterfaceFactory)ap.CreateInstance("PluginInteraface", "PluginInterface.PluginInterfaceFactory").Unwrap();
PluginInterfaceFactory Plugs = factory.Create(@"Intreface.dll", "PIPlugin_Liabrary.PIPluginClass", constructArgs);
IPluginInterface iPlugs = factory.Create(@"Client.dll", "PluginClient.PIPluginClass", constructArgs);
S_PLUGIN_INIT sp=new S_PLUGIN_INIT();
sp = g_stPlugInfo[0].iPlugs.OnLoad("1.0.0.0");
Object ctr=null;
iPlugs.OnShow(out ctr);
Control ctrl = ctr as Control;
if (ctrl != null)
{
ctrl.Visible = true;
((Form)ctrl).TopLevel=false;
ctrl.Dock = System.Windows.Forms.DockStyle.Fill;
splitMain.Panel2.Controls.Add(ctrl);//Вот здесь ошибка,типа не все поля доступны или имеются
}
т.е если возврящять простые классы или типы то все ок,но как сложные типа Form,Control то вот такая беда но это исчезает если вместо
AppDomain ap = AppDomain.CreateDomain("1");
поставить
AppDomain ap = AppDomain.CurrentDomain;
чето посмотрел я и нифига не понял че к чему. Я так понял что к плагинам в твоем случе обращяются не как к целому классу а как к набору геттеров и сеттеров. ты же ваидел код приведенный мною выше,мне желательно чтобы я через плагин менеджер на сервер возвращял целый объект унаследованный от общего интерфейса с конкретным набором методов. так можно зделать в твоем классе? И чем плоха надстройка в моем случае,я разве возвращя сейчас объект класса возвращяю не нормальный объект а что то еще (типа копии которая существует сам по себе?). Можно как то модифицировать мой код чтобы он работал как положено?
Где можно почитать про динамическую загрузку сборок плагинов,их отличий и тд в этом направлении?
Мне нужно здесь чем проще тем лучше,так как с плагинами будут работать еще менее квалифицированые люди