Permission denied: cannot call non-public or static methods remotely

一世执手 提交于 2019-12-12 06:56:57

问题


Ok I've found a solution to this particular error message on here already. But my case is slightly different. There are no "non-public" or "static" methods in my code. All are public. What I'm trying to do is pass a FrameworkElement (more specifically a web browser control) that was created in one process over to another process for display and use. Also I'm not using (and would to avoid using) any of the framework 3.5 addin stuff.

Fails at the following line everytime.

fe = FrameworkElementAdapters.ContractToViewAdapter(tab.ReturnBrowserObject)

tab.ReturnBrowserObject returns an INativeHandleContract which the above line is suppose to convert to a FrameworkElement.

edit: Code The relevant code from the host process.

 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

And the remoting object

<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

回答1:


Similar question was asked here

.NET remoting exception: Permission denied: cannot call non-public or static methods remotely

Also take a look on this question.

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

Is your code using some static or non public member? Static methods and fields accessed via a remoting proxy, are actually executed locally on the client side. So even though a type is configured to go remote static accesses/invokations dont go remote. If you need to access static data on the server side, you need to wrap the static access with instance methods / properties or fields. For non public, you will need to make them public. Please inspect your code and see if this helps.




回答2:


Ok so I got it working finally. Though not how I originally was going about it. The key is the Win32 API SetParent. The browser control is created in the secondary process and the re-parented to the primary process's window. The only issue left to solve is sizing.



来源:https://stackoverflow.com/questions/2846840/permission-denied-cannot-call-non-public-or-static-methods-remotely

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!