2014-04-01 63 views
0

我有一個C庫封裝在C庫上。 在C庫中我有一個函數,它將回調作爲輸入。 在C#中我有像委託一樣的公開回調。如何調用c中的遠程調用回調#

在正常模式下一切正常,但當我嘗試在遠程處理模式下調用相同的功能時,它會發出異常,如 無法加載文件或程序集。 我的遠程處理方案就像

1)SharedLib:我有一個C#共享庫,它具有通過C函數進行封裝的函數。 所有功能都在這個庫中定義。

2)服務器的控制檯應用程序服務器的角色是從Shredlib獲取會話,並打開一個端口,以便客戶端向服務器會話

3)客戶端控制檯應用程序:客戶端收聽由服務器打開的端口,並獲取會話對象來自server.It在sharedlib中定義了一個與delegate具有相同簽名的函數。會話對象client從sharedLib調用方法,它將回調作爲輸入。 具有相同簽名(如委託)的方法的客戶端傳遞地址來自sharedLib的方法,該方法需要回調作爲輸入。

之後,我收到異常,如「無法加載文件或程序集」。

如果我將null傳遞給以回調作爲輸入的參數,那麼在遠程處理模式下一切也都正常工作。 所以任何人都可以在遠程模式下使用回調。

+0

看一看'System.CrossAppDomainDelegate' – leppie

回答

0

三條建議:

1)不同的AppDomain是否在同一信任級別運行?如果信任級別較低,則第二個域可能無權加載程序集。

2)遠程應用程序沒有它加載程序集所需的目錄中所需的所有依賴關係。

3)這兩個應用程序都運行在相同版本的.NET下?如果一個是.NET 4.5,一個是.NET 3.5,那裏有一個.NET 4.0程序集,那麼第二個程序將無法運行它。

您可以嘗試啓用Fusion程序集綁定日誌記錄以查看加載失敗的更詳細原因。

+0

詳細的例外是 無法加載文件或程序集「select_bodies_with_class_selection_and_filter_callback,版本= 0.0.0.0,文化=中性公鑰= null'or它的一個依賴。該系統找不到指定的文件。 調用的目標引發了異常。 服務器堆棧跟蹤: 在System.RuntimeMethodHandle.SerializationInvoke(IRuntimeMethodInfo方法,對象目標,的SerializationInfo信息,的StreamingContext&上下文) 在System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(對象OBJ,SerializationInfo中的信息,的StreamingContext上下文) – user1305218

+0

在系統。 Runtime.Serialization.ObjectManager.FixupSpecialObject(持有的ObjectHolder) 在System.Runtime.Serialization.ObjectManager.DoFixups() 在System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler處理器,ISerParser serParser) 的系統。 Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream,HeaderHandler handler) at System。Runtime.Remoting.Channels.CoreChannel.DeserializeSoapRequestMessage(Stream inputStream,Header [] h,Boolean bStrictBinding,TypeFilterLevel securityLevel) – user1305218

+0

at System.Runtime.Remoting.Channels.SoapServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack,IMessage requestMsg,ITransportHeaders requestHeaders,Stream requestStream, IMEssage&responseMsg,ITransportHeaders&responseHeaders,Stream&responseStream) – user1305218