我们有一个现有的vb.net项目,它包含一个服务引用和一个抽象类。该类的一个属性是服务的PortTypeClient。该服务的访问级别是Friend。
MustInherit Public Class BassyBase
Private _ODQ As New ODQService.odqPortTypeClient
Public Property ODQClient As Object
Get
ODQClient = _ODQ
End Get
Set(value As Object)
_ODQ = value
End Set
End Property
Sub New(url as String)
Dim remoteAddress = New System.ServiceModel.EndpointAddress(url)
Dim binding As New BasicHttpBinding
binding.MaxReceivedMessageSize = Int32.MaxValue
ODQClient = New ODQService.dalsPortTypeClient(binding, remoteAddress)
ODQClient.Endpoint.Binding.SendTimeout = New TimeSpan(0, 0, 0, 30)
End Sub
End Class
使用VB的人已经使用基类数月没有问题。基类位于自己的DLL中。子课程正在单独的项目中构建。我试图从我的C#项目中的基类继承并发现虽然VB人员可以访问ODQ作为ODQService.ODQPortTypeClient,但在C#中我只能访问它作为它的对象。
C#行为对我来说很有意义,因为该服务是一个朋友(内部),并且它位于一个单独的DLL中。 DLL 之外的任何内容都不应该知道服务类类型。但是,不管感觉与否,我仍然需要使用该基类。有没有办法调整基类的项目,以便单独的DLL中的C#子类可以知道类型ODQService.ODQPortTypeClient
是什么而不使服务完全公开?也许强制服务的可访问性为Protected Friend
(内部)?不知?
答案 0 :(得分:2)
来自MSDN:
[Friend]指定一个或多个声明的编程元素 只能从包含它们的程序集中访问 声明。
内部关键字是类型和类型的访问修饰符 成员。内部类型或成员只能在文件中访问 同样的集会...
所以,它们是等价的。发布的代码中没有显示Friend
类的内容,但Option Strict On
这将无法编译:
...
Public Property ODQClient As Object
Get
ODQClient = _ODQ
End Get
Set(value As Object)
_ODQ = value ' <<< compiler error
End Set
End Property
Option Strict禁止从Object到ODQService.odqPortTypeClient
的隐式转换
嗯,这很容易解决:
Public Property ODQClient As ODQService.odqPortTypeClient
但那不会编译,因为公共财产试图&#34;促进&#34; odqPortTypeClient
的可访问性。
因此,必须使用As Object
和Option Strict Off
编译DLL。任何使用它的VB项目都必须依赖后期绑定来访问基类中的属性和方法,这意味着 还有Option Strict Off
。这也意味着Intellisense无法提供对底层成员的帮助,因为Type通过属性公开As Object
。
老实说,如果底层服务是由继承该类的东西使用的,那么服务的访问级别就会被破坏。