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

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

通常,我们将无法使用这样的代码进行编译(而且我们将在.Net中获得“不一致的可访问性”某种编译错误)。但不知何故,这个集会逃脱了。
我已经检查过了,程序集中只有一个PressurePartSize。
我不太确定什么时候有人说这件事做不到。Autodesk已经完成了;我得到了大会!
不仅如此,我们还可以在C#,但是有了错误信息中使用这个库。
由于保护级别的关系,Autodesk.Civil.DatabaseServices.Styles.PressurePartSize显示了可访问的错误。
该怎么做呢?我愿意使用任何语言来实现这一点,而不仅仅是C#。或.Net
发布于 2019-05-08 10:37:29
这不能在C#中完成。不过,.NET虚拟机比C#要宽松得多。有许多C#没有公开的特性。
在IL级别,您可以很好地调用非公共方法。您还可以使用使用反射发出的运行时代码生成来实现这一点。这对于创建快速序列化程序非常有用。
JIT还能够编译不可验证的、甚至不正确的IL。结果没有完全定义。
这个程序集是如何创建的?我的第一个想法是,这是一个IL链接工具的结果。可以对.NET程序集进行后处理以合并或优化它们.这也可能是混淆工具(特别是不能分解的方法)的结果。
看起来这个工具有一个bug,因为创建一个通常不可调用的公共方法肯定不是有意的。
如果您想要对此进行实验,您可以将任何程序集解压缩为IL,编辑并编译它。我相信任何东西都可以往返。
发布于 2019-05-08 10:14:43
只是个建议。可以有两个PressurePartSize类:一个公共类和一个内部类。从照片上看还不清楚。
就像这样:
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)’更难访问
但
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编译器在运行时检查可访问性。这就是你提到的例外的原因。
https://stackoverflow.com/questions/56037855
复制相似问题