无法访问 DLL 外部的内部类和某些公共变量不可访问

Posted

技术标签:

【中文标题】无法访问 DLL 外部的内部类和某些公共变量不可访问【英文标题】:Cannot access internal classes outside of DLL & certain public variables aren't accessible 【发布时间】:2018-01-20 08:37:05 【问题描述】:

我很难完成这项工作。

FooTypeWebAppIWebApp 3 个类在此 DLL 之外不得访问\可见。因此,sealedinternal 类。

我遇到的问题是......

1) 在WebApp 类中,FeeType1RouteOneBuilder 方法的参数中是不可访问的。

2) 在WebApp 类中,FeeType1 在 switch 的 case 语句中不可访问 \ 可见。 (需要可见)。

3) 在WebApp 类中,FeeType1CreditApplication 属性在开关的 case 语句中不可见(需要可见)。

这个复杂的脚本有更好的方法吗?我是否已经因为在这个 DLL 之外公开类而感到困惑?步骤 1 到 4 的所有步骤都可以以不同方式解决(或以某种方式修复)吗?

我不知道如何才能使这变得更简单。

internal static class FooType

    public class FeeType
    
        public FeeType()  
        public string CreditApplication = "Credit Application";
        public string CreditVehicle = "Credit Vehicle";
    
    public FeeType FeeType1
    
       get  return new FeeType(); 
       private set  
    
    
sealed class WebApp : IWebApp

    public string RouteOneBuilder(FooType.FeeType1 typing)
    
       var xml = "";

       switch(typing)
       
           case FooType.FeeType1.CreditApplication:
               xml = "asdf";
               break;
           default:
               throw new Exception("Unknown value");
       

       return xml;
    

internal interface IWebApp  

    string RouteOneBuilder(FooType.FeeType typing);

【问题讨论】:

那么,所有这些类和接口都在同一个源文件中吗? 3 个单独的 CS 文件,但都在同一个项目文件中(1 个 DLL 文件)。 那么命名空间呢?是在同一个命名空间还是不同的命名空间? IWebApp 接口是可见的,因为您已将public 添加到其中,您的意思是WebApp 类在类外可见吗? 3 个文件的命名空间相同(实际上 1 个项目中的所有文件都使用相同的命名空间)。 【参考方案1】:

您对sealed 类的定义不正确。它不是像publicprivateprotectedinternal 这样的访问修饰符。标记一个类sealed只表示它不能是inherited来自;它并没有说明 access 本身。

来自 MSDN 文档:

当应用于一个类时,sealed 修饰符会阻止其他类 从继承它。

这意味着您仍然可以提供public class that is sealed。但是,如果您尝试从 sealed 类继承,您将收到如下编译器错误:

不能从密封类型“YourNamespace.YourSealedClass”派生。


另外,我建议您阅读 this 和 this 关于内部/公共和嵌套类的内容。

现在,查看您提供的代码,弹出以下编译器错误:

FooType.FeeType1':不能在静态类中声明实例成员

这个错误意味着如果类被声明为静态的,那么所有的成员也必须是静态的。

FooType.FeeType1' 是一个“属性”,但用作“类型”

这是因为类是静态的,但没有成员是静态的。

可访问性不一致:参数类型“FooType.FeeType”较少 比方法 'IWebApp.RouteOneBuilder(FooType.FeeType)' 可访问

方法的形式参数列表中引用的返回类型和每个类型必须至少与方法本身一样可访问。

您可以找到有关上一个错误here 的更多信息。

【讨论】:

【参考方案2】:

设计不正确。

如果一个类型被标记为internal,这表明它永远不应该在它的DLL之外被访问。如果必须在声明它的 DLL 之外访问此类型,则不应将其标记为 internal

什么约束阻止您使用public 修饰符或阻止将类型包含在与使用代码相同的 DLL 中?

在某些情况下,外部 DLL 或 EXE 查看在另一个 DLL 中声明的 internal 成员很有用。一个值得注意的案例是单元测试。被测代码可能有一个internal 访问修饰符,但您的测试DLL 仍然需要访问代码才能对其进行测试。您可以将以下内容添加到包含internal 成员的项目的 AssemblyInfo.cs 以允许外部访问。

[assembly:InternalsVisibleTo("Friend1a")]

更多详情请见InternalsVisibleToAttribute Class。

旁注:sealed 访问修饰符不会阻止从声明的 DLL 外部进行访问。它可以防止其他类型扩展该类型。

【讨论】:

以上是关于无法访问 DLL 外部的内部类和某些公共变量不可访问的主要内容,如果未能解决你的问题,请参考以下文章

java 内部类和外部类的关系

在静态方法中new 一个内部类对象和new 一个外部类对象的区别

java内部类访问外部静态变量

内部类和 外部类相互访问

为什么匿名内部类和内部类只能访问final局部变量

java 访问修饰符