首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免类和方法可访问性不一致的编译错误?

如何避免类和方法可访问性不一致的编译错误?
EN

Stack Overflow用户
提问于 2019-05-08 09:47:33
回答 2查看 224关注 0票数 1

我反思了Autodesk程序集,发现了以下内容:

注意,对于PressurePipeNetwork类,它是public,还有一个方法AddLinePipe,它也是一个public。然而,AddLinePipe的一个参数,PressurePartSizeinternal

通常,我们将无法使用这样的代码进行编译(而且我们将在.Net中获得“不一致的可访问性”某种编译错误)。但不知何故,这个集会逃脱了。

我已经检查过了,程序集中只有一个PressurePartSize

我不太确定什么时候有人说这件事做不到。Autodesk已经完成了;我得到了大会!

不仅如此,我们还可以在C#,但是有了错误信息中使用这个库。

由于保护级别的关系,Autodesk.Civil.DatabaseServices.Styles.PressurePartSize显示了可访问的错误。

该怎么做呢?我愿意使用任何语言来实现这一点,而不仅仅是C#。或.Net

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-08 10:37:29

这不能在C#中完成。不过,.NET虚拟机比C#要宽松得多。有许多C#没有公开的特性。

在IL级别,您可以很好地调用非公共方法。您还可以使用使用反射发出的运行时代码生成来实现这一点。这对于创建快速序列化程序非常有用。

JIT还能够编译不可验证的、甚至不正确的IL。结果没有完全定义。

这个程序集是如何创建的?我的第一个想法是,这是一个IL链接工具的结果。可以对.NET程序集进行后处理以合并或优化它们.这也可能是混淆工具(特别是不能分解的方法)的结果。

看起来这个工具有一个bug,因为创建一个通常不可调用的公共方法肯定不是有意的。

如果您想要对此进行实验,您可以将任何程序集解压缩为IL,编辑并编译它。我相信任何东西都可以往返。

票数 3
EN

Stack Overflow用户

发布于 2019-05-08 10:14:43

只是个建议。可以有两个PressurePartSize类:一个公共类和一个内部类。从照片上看还不清楚。

就像这样:

代码语言:javascript
复制
namespace SampleLib
{
    using SampleLib.Internal;
    //using SampleLib.Public;

    public class PublicClass
    {
        public unsafe void PublicMethod(InternalClass internalClass) { }
    }
}

namespace SampleLib.Internal
{
    internal sealed class InternalClass { }
}

namespace SampleLib.Public
{
    public sealed class InternalClass { }
}

错误CS0051不一致可访问性:参数类型'InternalClass‘比方法'PublicClass.PublicMethod(InternalClass)’更难访问

代码语言:javascript
复制
namespace SampleLib
{
    //using SampleLib.Internal;
    using SampleLib.Public;

    public class PublicClass
    {
        public unsafe void PublicMethod(InternalClass internalClass) { }
    }
}

namespace SampleLib.Internal
{
    internal sealed class InternalClass { }
}

namespace SampleLib.Public
{
    public sealed class InternalClass { }
}

没事,

更新

只有一个PressurePartSize,请参阅更新的问题

一开始他们有Autodesk.Civil.DatabaseServices.Styles.PressurePartSize 的公共。然后他们用public unsafe ObjectId AddLinePipe(LineSegment3d line, PressurePartSize partSize)创建了一个库并构建了它。然后,他们将Autodesk.Civil.DatabaseServices.Styles.PressurePartSize更改为内部,但没有重新构建调用库。但是JIT编译器在运行时检查可访问性。这就是你提到的例外的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56037855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档