如何在iOS上使用mono覆盖ClientBase.CreateChannel方法

3
我正在将一个.NET WCF应用程序移植到Mono以在iOS中使用。由于iOS上的Mono不支持动态代码生成,因此我需要重写ClientBase.CreateChannel,如本帖所示:

Monotouch/WCF: How to consume the wcf service without svcutil

此解决方案使用通用的ChannelBase<TChannel>类。虽然该类在.NET 4.0中被定义为ClientBase<TChannel>的内部类,但我在Mono源代码中找不到它。似乎System.ServiceModel.Channels中有一个未实现的非泛型版本的ChannelBase,但我认为这里没有使用。
如果有人已经让这个解决方案工作了,请详细说明如何访问ClientBase<TChannel>
谢谢。
1个回答

2
我们最终在ClientBase<TChannel>的内部类中找到了ChannelBase<TChannel>。它被标记为internal。我们必须删除internal修饰符才能使用该类并重新编译mono,但随后之前提到的帖子中的解决方案就可以奏效了。
我无法解释为什么ChannelBase<TChannel>被标记为internal。这似乎与其在.Net中的定义不符。

查看Mono的源代码,它在基于Silverlight配置文件的Monotouch中标记为“protected internal”,而在所有其他版本中标记为“internal”。查看MSDN文档向我展示了该类仅存在于Silverlight和.NET 4.0及更高版本中。我想internal修饰符的原因是它在.NET 2.0中不存在。我会为您解决这个问题。 - Martin Baulig
已在mono/master提交c0e3517中修复。然而,这不应该对您的Monotouch产生影响,因为该类已经在那里标记为“protected”。 - Martin Baulig
谢谢Martin。protected internal是否仍意味着该类只能在定义它的程序集中使用?通常,ChannelBase<TChannel>将在其他覆盖CreateChannel方法的程序集中使用,就像我的情况一样。 - afreedm1
不,它的意思是受保护的或者是内部的 - 并且在定义它的程序集之外变成了受保护的。因此当你重写它时,你使用 "protected override"。 - Martin Baulig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接