В доступе отказано: нельзя вызывать непубличные или статические методы удаленно - PullRequest
0 голосов
/ 17 мая 2010

Хорошо. Я уже нашел решение этого конкретного сообщения об ошибке здесь.Но мой случай немного отличается.В моем коде нет "непубличных" или "статических" методов.Все публично.Я пытаюсь передать FrameworkElement (точнее, элемент управления веб-браузера), который был создан в одном процессе, другому процессу для отображения и использования.Кроме того, я не использую (и не буду использовать) какие-либо дополнительные компоненты framework 3.5.

Сбой в следующей строке.

fe = FrameworkElementAdapters.ContractToViewAdapter(tab.ReturnBrowserObject)

tab.ReturnBrowserObject возвращает INativeHandleContract, который приведенная выше строка должна преобразовать в FrameworkElement.

edit: Code Соответствующий код из хост-процесса.

 Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        'Try
        Dim h As EventWaitHandle
        g = Guid.NewGuid()
        h = New EventWaitHandle(False, EventResetMode.ManualReset, "Tab" & g.ToString)
        StartTabProcess()
        Dim f As Boolean = h.WaitOne(New TimeSpan(0, 0, 10), False)
        If f = False Then
            p.Kill()
        End If
        CreateIPCChannels()
        Dim inhc As INativeHandleContract = tabClient.ReturnBrowserObject
        fe = FrameworkElementAdapters.ContractToViewAdapter(inhc)
        Me.Grid1.Children.Add(fe)

        'Catch ex As Exception
        '    MsgBox(ex.ToString)

        'End Try
    End Sub 
Private Sub StartTabProcess()
        Dim str As String = String.Format(CultureInfo.InvariantCulture, "/guid:{0} /id:{1}", New Object() {g, Process.GetCurrentProcess.Id})
        p = New Process
        p.StartInfo.CreateNoWindow = True
        p.StartInfo.UseShellExecute = False
        p.StartInfo.Arguments = str
        p.StartInfo.FileName = "BrowserTabHost.exe"
        p.Start()
    End Sub
Private Sub CreateClientIPC()
        Dim serverProv As New BinaryServerFormatterSinkProvider()
        serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full
        Dim clientProv As New BinaryClientFormatterSinkProvider()

        Dim properties As System.Collections.IDictionary = New System.Collections.Hashtable()
        properties("name") = "Client"
        properties("portName") = g.ToString
        properties("typeFilterLevel") = "Full"
        properties("exclusiveAddressUse") = "False"
        ' Create the channel. 
        Dim serverChannel As New IpcChannel(properties, clientProv, serverProv)
        ChannelServices.RegisterChannel(serverChannel, False)

        tabClient = DirectCast(Activator.GetObject(GetType(BrowserObject), "ipc://" & g.ToString & "/TabClient"), BrowserObject)
    End Sub

Иудаленный объект

<Serializable()> _
Public Class BrowserObject
    Inherits MarshalByRefObject
    Public ihc As INativeHandleContract
    Public ad As Dispatcher
    Public handle As IntPtr
    Public Delegate Sub ManipulateWB()
    Dim newWeb As WebBrowser
    Public Delegate Function CreateAndReturnWebInstance()
    Public Property Browser As Pajocomo.Windows.Forms.WebBrowserControl
    Dim wfh As WindowsFormsHost
    Public Sub New()
        ad = Dispatcher.Current
    End Sub
    Public Function ReturnBrowserObject() As INativeHandleContract
        Try
            ad.DoWork(New CreateAndReturnWebInstance(Function()
                                                         newWeb = New WebBrowser
                                                         'wfh.Child = newWeb
                                                         ihc = FrameworkElementAdapters.ViewToContractAdapter(newWeb)
                                                         Return Nothing
                                                     End Function))

            Return ihc
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Function
    Public Sub SetDockSettings()
        'Browser.Dispatcher.BeginInvoke(New ManipulateWB(Sub()
        '                                                    Browser.NavigateToURL("http://neowin.net")
        '                                                End Sub))
    End Sub
    Private Function CreateWebInstance()
        '    Browser = New Controls.WebBrowser
        Return Browser
    End Function
End Class

Ответы [ 2 ]

1 голос
/ 17 мая 2010

Подобный вопрос был задан здесь

Исключение удаленного взаимодействия .NET: Отказано в доступе: невозможно удаленно вызывать непубличные или статические методы

Также взгляните на этот вопрос.

http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/d8fd1cb7-6c6f-4ef4-b690-804c2147ce8b

Ваш код использует статический или не публичный член? Статические методы и поля доступны через удаленный прокси, на самом деле выполняются локально на сторона клиента. Так что, хотя тип настроен на удаленный статический доступ / вызовы не проходят удаленно. Если вам нужен доступ к статическим данным на на стороне сервера, вам нужно обернуть статический доступ с методами экземпляра / свойства или поля. Для непубличных, вам нужно будет сделать их публичными. Пожалуйста, проверьте ваш код и посмотрите, это помогает.

0 голосов
/ 19 мая 2010

Хорошо, так что я наконец заработал. Хотя не так, как я изначально собирался. Ключ Win32 API SetParent. Элемент управления браузером создается во вторичном процессе и повторно связан с окном первичного процесса. Единственная проблема, которую нужно решить, это размер.

...