问题 是否存在通配符排序功能,使内部组件对与公共程序集名称匹配的程序集可见?


是否存在通配符类型的功能,以使内部对共享公共程序集的程序集可见 重大的(我的英语是失败的我的名字)?

例如, The.Empire 是所有组件的主要名称。我试过了 The.Empire.*但无济于事。

大会A.

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.*")]


namespace The.Empire
{
    internal static class Constants
    {
        internal readonly static string CommonId = "Luke";
    }
}

大会B.

namespace The.Empire.Strikes
{
    public class Mate
    {
        public void AccessSomething()
        {
            Console.WriteLine("{0}", Constants.CommonId); // inaccessible
        }
    }
}

大会C.

namespace The.Empire.Back
{
    public class Mate
    {
        public void AccessSomething()
        {
            Console.WriteLine("{0}", Constants.CommonId); // inaccessible
        }
    }
}

这可能吗?关于OOP继承类比,类似的东西 protected,只有派生者才能访问受保护的

如果我将特定的程序集名称放在InternalsVisibleTo上,那么它不是松耦合。除非我重新编译AssemblyA,否则无法满足程序集A的其他实现程序

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.Strikes")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.Back")]

11929
2017-08-12 02:03


起源

internal 旨在减少实现细节耦合的可能性。 InternalsVisibleTo 旨在放宽对强相关程序集的限制 - 代码应具有自己的程序集,但仍然与其他程序集强耦合。您所描述的内容与该模式不符。您尝试解决的更高级别目标是什么?有可能其他技术可以更好地为您工作(例如,仍然将您的定义保持在内部,但将其作为源文件暴露给消费代码,而不是组件 - 例如构建版本常量) - Merlyn Morgan-Graham
我还有一个用例:我有几个单元测试项目,而不是单独指定每个程序集,我只想拥有“MyNamespace。*。UnitTests”。 - thoean


答案:


文档 建议指定多个程序集的唯一方法是使用多个属性或在单个属性中使用多个名称:

您可以通过两种方式定义多个朋友程序集。他们可以出现   作为单独的汇编级属性...... [或者它们]也可以出现   使用单独的InternalsVisibleToAttribute标记,但只有一个程序集   关键词。

那是:

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]

要么:

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]

我不认为你想要什么是可能的,而且可能是故意的。使内部构件对另一个组件可见是应该谨慎使用的,因为它允许比其他方式所需的更多耦合。因此,除非您绝对意味着将它们展示给给定的组件,否则很难显示您的内部结构。通配符积极地反对这一点。

您最好的选择(如果您不想使用多个属性)是a)合并程序集,以便它们可以自然地共享 internals或b)做某些钥匙 internal 会员 public (要么 protected)并使其成为其他组件的集成点。


10
2017-08-12 02:06