.net 在构建API结构时,模块成员的作用域是错误的命名空间

.net 在构建API结构时,模块成员的作用域是错误的命名空间,.net,vb.net,dll,structure,hierarchy,.net,Vb.net,Dll,Structure,Hierarchy,我正在使用Visual Studio 2013,试图开发一个具有以下成员结构的自己的API: 问题是,Extensions模块的成员在Elektro.Xml.Extensions中公开,但也在Elektro.Xml中公开: 为什么会这样?如何修复它 Extensions.vb 这是标准,而不是“固定”的东西。有关更多详细信息,请参见第7.7节: 标准模块的成员有两个完全限定名,一个没有标准模块名,另一个有标准模块名。命名空间中的多个标准模块可以定义具有特定名称的成员;对任何模块外部名称的非

我正在使用Visual Studio 2013,试图开发一个具有以下成员结构的自己的API:

问题是,
Extensions
模块的成员在
Elektro.Xml.Extensions
中公开,但也在
Elektro.Xml
中公开:

为什么会这样?如何修复它


Extensions.vb
这是标准,而不是“固定”的东西。有关更多详细信息,请参见第7.7节:

标准模块的成员有两个完全限定名,一个没有标准模块名,另一个有标准模块名。命名空间中的多个标准模块可以定义具有特定名称的成员;对任何模块外部名称的非限定引用都是不明确的。例如:


检查github中的随机第三方API(我通常会这样做来发现新技术和获取知识),我发现要解决这个问题,开发人员只需将
hidemomodulename
属性设置为模块,就可以了


您无法修复它。这很正常。C#具有完全相同的功能,即通过使用指令(VB
Imports
)的
在作用域中显示扩展方法的名称空间,或者通过直接引用包含它们的
静态
类来显示扩展方法。@Damien#感谢您的评论。如果我错了,请纠正我,但我认为您不是指我描述的问题,您的意思是可以从拥有方法的模块(
Namespace.MyStringExtension(MyString,more params)
)以及扩展方法在第一个参数中接受的类型的实例访问扩展(
MyString.MyStringExtension(更多参数)
),当然,我知道这一点,但我要问的是,模块的成员显示在两个不同的名称空间中!
Elektro.Xml
Elektro.Xml.Extensions
,这正常吗?。是的,请看(尽管我认为该页面上的一些代码示例有问题):“在模块中声明编程元素时,Visual Basic将其作用域升级到包含该模块的命名空间”但是,我有什么方法来防止这种注释效应呢?我没有看到.Net framework类库名称空间中充满注释扩展方法,我希望在构建数据结构时存在一些解决方法。我不想编译额外的dll/VS解决方案,比如“Elektro.XmlExtensions”只是为了存储一些扩展包…模块应该是“Elektro.Xml”名称空间的一部分。谢谢您的回答。@ElektroStudios-大多数,如果不是全部的话,.Net framework类库都是在C#中实现的,而不是在VB中实现的。C#在这里有稍微不同的规则(它使用
静态
类而不是“模块”)这里的规则有些不同)。因此,有一个明显的方法可以避免这种“恼人”的行为,但它可能不是你能够或愿意去做的。@ElektroStudios-并且将它移动到一个单独的DLL不会“修复”它,我相信-如果你是VB消费VB,那么VB规则适用。我很失望你将我的答案描述为“错”。我描述了标准的行为。@Damien_不信者对不起,我的英语不是我想要的那么好来表达我自己,“错”不是正确的词,可能是“缺失”、“不完整”或“过时”",因为此属性适用于您提到的VB规则。他们不能这样做,但他们可以。感谢您的评论。人们通常会不遗余力地帮助他人。当OP进行自我回答并调整一些琐碎的事情或类似的事情时,这会使解决方案提供商非常恼火,不想为某个问题提供太多帮助而我曾经帮助过一个有5k代表的人,他当时只是做了一个自我回答,因为他的文件路径与我的不同example@Drew谢谢你的评论。我想说的是,我不认同你的评论,你揭露的那个家伙的案子……他只是很愚蠢,但我认为这是不同的,实际的答案已经提供了非常有用的信息,但没有提供解决方案,更重要的是,他说没有解决方案(不是用这些话,而是),我给了他一个投票,并接受了他的解决方案,直到现在,因为我找到了一个解决方案。够公平的,我只是说,我一直知道这可能与你的情况无关。继续
Public Module Extensions

#Region " Public Extension Methods "

#Region " Type Conversion "

    <Extension>
    Public Function ToXDocument(ByVal sender As XmlDocument) As XDocument
       ...
    End Function

#End Region

#End Region

End Module
Public NotInheritable Class XmlUtil

#Region " Public Methods "

    Public Shared Function XmlBeautifier(...) As String
        ...
    End Function

#End Region

End Class
Namespace N1
    Module M1
        Sub S1()
        End Sub

        Sub S2()
        End Sub
    End Module

    Module M2
        Sub S2()
        End Sub
    End Module

    Module M3
        Sub Main()
            S1()       ' Valid: Calls N1.M1.S1.
            N1.S1()    ' Valid: Calls N1.M1.S1.
            S2()       ' Not valid: ambiguous.
            N1.S2()    ' Not valid: ambiguous.
            N1.M2.S2() ' Valid: Calls N1.M2.S2.
        End Sub
    End Module
End Namespace