【问题标题】:How to override ClientBase.CreateChannel in mono on iOS如何在 iOS 上以单声道覆盖 ClientBase.CreateChannel
【发布时间】:2012-11-03 14:07:13
【问题描述】:

我正在将一个 .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>的?

谢谢。

【问题讨论】:

    标签: iphone ios wcf mono xamarin.ios


    【解决方案1】:

    我们最终发现ChannelBase<TChannel>ClientBase<TChannel> 的内部类。它被标记为内部。我们必须删除 internal 修饰符才能使用该类并重新编译 mono,但是之前引用的帖子中的解决方案起作用了。

    我无法解释为什么ChannelBase<TChannel> 被标记为内部。这似乎与 .Net 中的定义不符。

    【讨论】:

    • 查看Mono的源代码,在Monotouch(基于Silverlight配置文件)中标记为protected internal,在所有其他版本中标记为internal。查看 MSDN 文档向我展示了该类仅存在于 Silverlight 和 .NET 4.0 及更高版本中。我想internal 修饰符的原因是它在.NET 2.0 中不存在。我会为你解决这个问题。
    • 在单声道/主提交 c0e3517 中修复。但是,这应该不会影响 Monotouch,该类已经被标记为 protected
    • 谢谢马丁。受保护的内部是否仍然意味着该类只能在定义它的程序集中使用?一般情况下,ChannelBase 将用于覆盖 CreateChannel 方法的其他程序集,如我的情况。
    • 不,它意味着受保护或内部 - 它在定义它的程序集之外受到保护。因此,当您覆盖它时,您使用“受保护的覆盖”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多