在.Net Remoting Service中注册动态类型时出现问题

时间:2010-12-22 17:16:06

标签: .net remoting reflection.emit

我正在使用Emit在我的项目中创建一些动态类型,特别是在我的服务接口周围替换“Decorators”。 我也是为.Net Remoting注册的类作为WellKnownServiceType。但是,.Net Remoting似乎与动态发射的类型不太一致。 首先,我得到了:

System.IO.FileNotFoundException: Could not load file or assembly 'Dynamic, Version=0.0.0.0, Culture=neutral, PublicKeyToken=XXXX' or one of its dependencies. The system cannot find the file specified.

当然文件不存在,程序集是动态的,我将Emit设置为“Run”程序集,而不是SaveAndRun。

因此,在注册类型之前,我调用Assembly.Load(type.Assembly.GetName())。 现在,我明白了:

System.Runtime.Remoting.RemotingException: Requested Service not found
Server stack trace: 
   at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)

错误仅在客户端出现,作为服务器的异常。我没有在服务器日志中看到任何错误。

任何人都有线索是否这是一个“众所周知”的问题,动态类型不能用于托管.net远程服务? 有任何提示或指针可以解决它吗?

** 更新 * *** 我已经停止使用Emit了。 Emit强迫我在我的核心程序集中放置一个“InternalsVisibleTo”属性,这严重影响了混淆。相反,我已经使用CodeDom命名空间切换到代码生成。它工作得很漂亮。我可以看到完成这项工作的实际源代码,这在调试时非常有用。

1 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题。 正如您可能从堆栈跟踪中注意到的那样,问题来自Assembly.Load

Server stack trace: 
   ...
   at System.Reflection.Assembly.Load(...)
   at System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.LoadType(String typeName, String assemblyName)
   at System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.GetServerTypeForUri(String URI)
   at System.Runtime.Remoting.RemotingConfigHandler.GetServerTypeForUri(String URI)
   at System.Runtime.Remoting.RemotingServices.GetServerTypeForUri(String URI)
   at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(...)

您可以提供AssemblyResolve事件处理程序,以允许您以可装配的方式控制自定义的加载。可见:

AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args)
{
    if (args.Name.Equals(type.Assembly.FullName))
        return type.Assembly;
    return null;
};
相关问题