Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов методов из другого процесса

16K
29 марта 2007 года
homeric
39 / / 13.02.2007
Можт падскажет кто как можно дёрнуть за метод в другом процессе используя pipe. Ведь вроде тока данные можна передавать... ((( Отражение тоже не паможет... ссылки не имеют смысла в другом процессе....

Что мне делаааать...ПАМАГИТЕ!
713
30 марта 2007 года
Ap0k
360 / / 13.03.2006
Если приложение на другом конце канала (pipe) - managed, то следует воспользоваться Remoting через tcp/ip, отказавшись от pipe, т.к сомневаюсь, что вы сможете реализовать транспорт через pipe в виде провайдера для remoting.
16K
30 марта 2007 года
homeric
39 / / 13.02.2007
На самом деле проблема в самой специфике задачи...
Я осуществляю взаимодействие между работающим дот нетовским приложением и дот нетовкой же длл-кой которую юзают скрипты виставского Сайд Бара как актив икс обьект регистрируя его в реестре при первом запуске скрипта....

По сути - это проблема поддержки приложением вистовских гаджетов....но попрашу заметить - на Локальной машине.

Можно конечно ввести ограничение на ТиСиПи...но...
Использовать его для взаимодействия между процессами на одном компе концептуально неверно....

В дот нете осуществлять взаимодействие через пайп не намного сложнее чем через тисипи...классов пално...

Если вышеописанная проблема по вашему мнению не имеет решения что более чем вероятно....вы могли бы аргументированно высказать свою точку зрения чем сэкономите мне кучу времени...Буд очень благадарен....

Использование доменов приложений не даёт решения - они нужны видимо лишь для ускорения работы приложения....

Ктонить ляпните чонить умное ради боже спасите беднава юзвера....
273
05 апреля 2007 года
3A3-968M
1.2K / / 22.12.2005
Можно использовать WCF - Windows Communication Foundation в .NET 3.0, там есть средства для взаимодействия между приложениями. А домены приложений - это тоже вариант решения, обмениваться объектами и запускать методы можно от имени другого домена, используя объект MarshalByRef. Например, можно из одного домена создать экземпляр класс в другом домене...пример нужен??
273
07 апреля 2007 года
3A3-968M
1.2K / / 22.12.2005
Пример показывает, как создать экземпляр класса и поместить его в другой домен. Создаём byref-класс, для того чтобы можно было передавать ссылку через домены
 
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]public [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]class[/COLOR][/SIZE][SIZE=2][COLOR=#008080]MyRefClass[/COLOR][/SIZE][SIZE=2] : [/SIZE][SIZE=2][COLOR=#008080]MarshalByRefObject[/COLOR][/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]

Далее создаём домен и в нём экземпляр этого класса:
 
Код:
[SIZE=2][COLOR=#008080][FONT=Courier New]AppDomain[/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2] newDomain = [/SIZE][SIZE=2][COLOR=#008080]AppDomain[/COLOR][/SIZE][SIZE=2].CreateDomain([/SIZE][SIZE=2][COLOR=#800000]"NewDomain"[/COLOR][/SIZE][/FONT][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]
406
10 апреля 2007 года
vitaly2003s
481 / / 27.07.2004
Цитата: 3A3-968M
Пример показывает, как создать экземпляр класса и поместить его в другой домен. Создаём byref-класс, для того чтобы можно было передавать ссылку через домены
 
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]public [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]class[/COLOR][/SIZE][SIZE=2][COLOR=#008080]MyRefClass[/COLOR][/SIZE][SIZE=2] : [/SIZE][SIZE=2][COLOR=#008080]MarshalByRefObject[/COLOR][/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]

Далее создаём домен и в нём экземпляр этого класса:
 
Код:
[SIZE=2][COLOR=#008080][FONT=Courier New]AppDomain[/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2] newDomain = [/SIZE][SIZE=2][COLOR=#008080]AppDomain[/COLOR][/SIZE][SIZE=2].CreateDomain([/SIZE][SIZE=2][COLOR=#800000]"NewDomain"[/COLOR][/SIZE][/FONT][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 не будет валиден... так вот как зделать так чтобы в данном подходи при возвращении любого класса он был валиден?

273
12 апреля 2007 года
3A3-968M
1.2K / / 22.12.2005
Тогда пишешь proxy-класс, который манипулирует формой в другом домене. Этот класс наследуется от MarshalByRef, создаёшь его экземпляр и отсоединяешься при помощи CreateInstanceAndUnwrap, экземпляр на этот proxy будет доступен и в твоём домене
406
12 апреля 2007 года
vitaly2003s
481 / / 27.07.2004
Цитата: 3A3-968M
Тогда пишешь proxy-класс, который манипулирует формой в другом домене. Этот класс наследуется от MarshalByRef, создаёшь его экземпляр и отсоединяешься при помощи CreateInstanceAndUnwrap, экземпляр на этот proxy будет доступен и в твоём домене




1. есть библиотека класса содержащяя 1 интерфей(Plugin.dll)

Код:
namespace PluginInterface
{

    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;

Код:
namespace PluginClient
{
    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 и использовать класс формы которая есть в этой длл

Код:
AppDomain ap = AppDomain.CreateDomain("1");
 //// 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;
273
14 апреля 2007 года
3A3-968M
1.2K / / 22.12.2005
Взаимодействие плагина и хост-приложения выполняется не так, как ты описал. Если хочешь посмотреть, как реализовывать простое подключение плагинов в сочетании с открытой архитектурой, где плагин имеет доступ ко всем внутренностям хоста, лезь в мой проект Metadata Explorer, там показан механизм динамической загрузки сборок и плагинов из них (ветка с темой в этом же разделе). Если будет непонятно, объясню архитектуру. То, что хочешь сделать ты, называется не плагином, а надстройкой. Надстройка выполняется в собственном изолированном контексте, единственный способ обмена между доменами в .NET - прокси-классы. Обмениваться объектами между доменами можно только при помощи сериализации. Т.ею. в одном домене экземпляр сериализуется, передаётся через прокси в другой домен.
406
16 апреля 2007 года
vitaly2003s
481 / / 27.07.2004
Цитата: 3A3-968M
Взаимодействие плагина и хост-приложения выполняется не так, как ты описал. Если хочешь посмотреть, как реализовывать простое подключение плагинов в сочетании с открытой архитектурой, где плагин имеет доступ ко всем внутренностям хоста, лезь в мой проект Metadata Explorer, там показан механизм динамической загрузки сборок и плагинов из них (ветка с темой в этом же разделе). Если будет непонятно, объясню архитектуру. То, что хочешь сделать ты, называется не плагином, а надстройкой. Надстройка выполняется в собственном изолированном контексте, единственный способ обмена между доменами в .NET - прокси-классы. Обмениваться объектами между доменами можно только при помощи сериализации. Т.ею. в одном домене экземпляр сериализуется, передаётся через прокси в другой домен.



чето посмотрел я и нифига не понял че к чему. Я так понял что к плагинам в твоем случе обращяются не как к целому классу а как к набору геттеров и сеттеров. ты же ваидел код приведенный мною выше,мне желательно чтобы я через плагин менеджер на сервер возвращял целый объект унаследованный от общего интерфейса с конкретным набором методов. так можно зделать в твоем классе? И чем плоха надстройка в моем случае,я разве возвращя сейчас объект класса возвращяю не нормальный объект а что то еще (типа копии которая существует сам по себе?). Можно как то модифицировать мой код чтобы он работал как положено?
Где можно почитать про динамическую загрузку сборок плагинов,их отличий и тд в этом направлении?

Мне нужно здесь чем проще тем лучше,так как с плагинами будут работать еще менее квалифицированые люди

273
18 апреля 2007 года
3A3-968M
1.2K / / 22.12.2005
В моём случае любой плагин реализуется отдельным классом, наследующемся от класса MetadataExplorerPlugin - он реализует непосредственно функционал, несколько плагинов могут располагаться в отдельной сборке. Там же располагаются менеджеры плагинов, наследники класса MetadataExplorerPluginManager - он реализует управление плагином. Сборка с плагином скомпиллирована и кидается в папку, далее хост-приложение запускается и просматривает загружает все сборки из этой папки, далее в каждой сборке ищются наследники классов MetadataExplorerPluginManager, создаётся экземпляр менеджера при помощи активатора - System.Activator, далее при помощи менеджера получаем сам плагин - вот и всё.
1.9K
04 мая 2007 года
tva94
115 / / 01.05.2007
Есть два приложения, две одинаковых формы. На каждой по текстбоксу и кнопке. При нажатии на кнопку во второй форме текст становиться такой-же, как и в первой и наоборот. Заранее благадарен. И пожалуйста дайте исходник!!!
273
05 мая 2007 года
3A3-968M
1.2K / / 22.12.2005
Какие условия работы каждого из приложений: приложения стронние или написаны тобой? одно приложение запускает другое (т.е. является ли дочерним или самостоятельным процессом)?
1.9K
07 мая 2007 года
tva94
115 / / 01.05.2007
Скинте мне работающий проэкт, а дальше я сам разберусь!
273
13 мая 2007 года
3A3-968M
1.2K / / 22.12.2005
Пример взаимодействия двух приложений, выполняющихся в разных доменах и при этом взаимодействуют друг с другом через делегатор. Суть проста: одно оконное приложение создаёт домен и запускает в нём свою копию, далее создаёт в этом домене через CreateInstanceAndUnwrap делегатор, которы служит мостом между двумя доменами. Это происходит при нажатии первой кнопки на форме. Далее жмём вторую кнопку и видим, как у второго приложения менятся текст кнопки.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог