2010-05-17 116 views
-1

好的我已经在这里找到了这个特定错误信息的解决方案。但我的情况稍有不同。我的代码中没有“非公共”或“静态”方法。一切都是公开的。我想要做的是将一个在一个进程中创建的FrameworkElement(更具体地说是一个Web浏览器控件)传递给另一个进程以供显示和使用。此外,我没有使用(并会避免使用)任何框架3.5插件的东西。权限被拒绝:无法远程调用非公共或静态方法

每次都在下面一行失败。

fe = FrameworkElementAdapters.ContractToViewAdapter(tab.ReturnBrowserObject)

tab.ReturnBrowserObject返回其上面的行是假设转换为FrameworkElement的一个INativeHandleContract。

编辑:代码 来自主机进程的相关代码。

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 

回答

0

好吧,我终于搞定了。虽然不是我原来如何去做的。关键是Win32 API SetParent。浏览器控件是在辅助进程中创建的,并重新发布到主进程的窗口。要解决的唯一问题是大小。

+0

你究竟做了什么来解决这个问题? – 2017-06-08 19:38:30

+0

相信上面的答案告诉我做了什么,如果你正在寻找更多的信息.​​.....我不记得我已经说过了什么,并且不能轻易地获得更多细节的代码。 由于原来的问题是远程相关...我想我的实际答案并不能解决原来的问题。 – rstat1 2017-06-10 01:27:36

1

类似的问题在这里提出的远程对象

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

还拿这个问题来看看。

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

是使用一些静态的还是非 公共成员的代码?通过远程代理访问的静态方法和 字段实际上在客户端的本地执行 客户端。所以即使一个类型是 配置为远程静态 访问/ invokations不要远程。 如果您需要访问服务器端的 上的静态数据,则需要使用实例方法/ 属性或字段来包装 静态访问。非公开, 您需要将其公开。 请检查您的代码,看看是否有帮助 。

+0

正如我之前说过的,我的代码中没有静态或非公共方法。事实上,我所有的代码都是公开的。 – rstat1 2010-05-17 05:50:26

+0

你能告诉我们你的代码吗? – hgulyan 2010-05-17 07:08:28

+0

什么是“FrameworkElementAdapters”?这是一个类名吗?如果是这样,你提供的代码行看起来像是调用静态(VB中的Shared)方法。 – 2010-05-17 13:26:57

相关问题