2010-05-17 118 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

相關問題