Интер-аддин связи - PullRequest
       78

Интер-аддин связи

0 голосов
/ 30 января 2012

Мне удалось программно создать окно инструментов AddIn VS2010 из F # Interactive, которое само является окном инструментов, используя CreateToolWindow2 .Аргументы Assembly и Class, которые я передаю CreateToolWindow2, соответствуют Panel (WinForms), который составляет окно инструментов.Ссылка на созданную панель «возвращается» через аргумент ControlObject out ref.

Помечая сборку моей панели атрибутом ComVisible(true), я возвращаю экземпляр, за исключением случаев, когда я пытаюсь получить доступ к любым членам экземпляра (из контекста F # Interactive), я получаю RemotingException: «Этот удаленный прокси-сервер не имеет приемника каналов, что означает, что либо у сервера нет зарегистрированных каналов сервера, которые прослушивают, либо у этого приложения нет подходящего клиентского канала для общения с сервером».

Любые идеи, как обойтисьэто препятствие?

Ответы [ 2 ]

1 голос
/ 30 января 2012

Служба WCF с использованием именованных каналов .Сейчас я делаю это для связи между поверхностью разработки некоторых видов деятельности WF4 и визуальным студийным расширением.

Это очень просто сделать.Я не могу показать весь код, так как некоторые из него обернуты в помощники, которые управляют открытием и закрытием канала, но определение довольно простое и сделано все в коде.

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

var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
binding.ReceiveTimeout = TimeSpan.FromMinutes(1);

создайте свой канал

var channelFactory = new ChannelFactory<IServiceInterface>(binding, endpointAddress);

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

private const string AddressFormatString =
    "net.pipe://localhost/Company/App/HostType/{0}";
private static string _hostAddress;

public static string HostAddress()
{
    if (_hostAddress == null)
        _hostAddress = string.Format(
                           AddressFormatString, 
                           Process.GetCurrentProcess().Id);
    return _hostAddress;
}

У вас будет две фактические копии этого (одна в клиентском домене приложения, другая в домене приложения аддина), нотак как они оба находятся в одном и том же процессе, адрес хоста гарантированно будет одинаковым в обоих, и вы не столкнетесь с проблемами, когда у вас одновременно будет загружено несколько экземпляров VS (без суеты Running Object Table, спасибо).

Я храню этот код адреса в базовом классе хоста.Открыть канал хоста также довольно просто:

Host = new ServiceHost(this, new Uri(HostAddress()));

var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);    
Host.AddServiceEndpoint(typeof(IServiceInterface), binding, HostAddress());
Host.Open();
1 голос
/ 30 января 2012

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

...