Нужен пример вызова RPC, написанный на C # - PullRequest
1 голос
/ 19 декабря 2009

Я имею дело с ошибками и тайм-аутами соединения WMI и сначала попробую проверить стек RPC. Я нашел следующий фрагмент кода C, но не понимаю, работает ли он и как, и где я могу найти дополнительную информацию или даже образец.

RPC_STATUS status;
unsigned short *StringBinding;
RPC_BINDING_HANDLE BindingHandle;
status = RpcStringBindingCompose
  (
    NULL,                // Object UUID
    L"ncacn_ip_tcp",      // Protocol sequence to use
    L"MyServer.MyCompany.com", // Server DNS or Netbios Name
    NULL,
    NULL,
    &StringBinding
  );
// Error checking ommitted. If no error, we proceed below
status = RpcBindingFromStringBinding(StringBinding, &BindingHandle);

// free string regardless of errors from RpcBindingFromStringBinding
RpcStringFree(&StringBinding);

Этот код действительно устанавливает соединение? У кого-нибудь есть декларация взаимодействия для C #?

Спасибо, пока.

ш - mabra

1 Ответ

4 голосов
/ 22 декабря 2009

Вот код взаимодействия для вашего примера выше:

class Rpc
{
    [DllImport("Rpcrt4.dll", CharSet = CharSet.Auto)]
    public static extern int RpcStringBindingCompose(
        string ObjUuid,
        string ProtSeq,
        string NetworkAddr,
        string EndPoint,
        string Options,
        out string StringBinding);

    [DllImport("Rpcrt4.dll", CharSet = CharSet.Auto)]
    public static extern int RpcBindingFromStringBinding(
        string StringBinding,
        out IntPtr Binding);

    [DllImport("Rpcrt4.dll", CharSet = CharSet.Auto)]
    public static extern int RpcBindingFree(
        ref IntPtr Binding);

    public Rpc()
    {
        string stringBinding = null;

        int retCode = RpcStringBindingCompose(
             null,                // Object UUID
             "ncacn_ip_tcp",      // Protocol sequence to use
             "MyServer.MyCompany.com", // Server DNS or Netbios Name
             null,
             null,
             out stringBinding );

        IntPtr bindingHandle = IntPtr.Zero;
        retCode = RpcBindingFromStringBinding(stringBinding, out bindingHandle);

        retCode = RpcBindingFree(ref bindingHandle);
    }
}
...