访问 Web 服务中的内部类和方法,无需隐藏代码

本文关键字:隐藏 代码 方法 服务 Web 内部类 访问 | 更新日期: 2023-09-27 18:32:47

我在某个命名空间中有一个 Web 服务,我们称之为 MyNamespace 。这是一个普通的 Web 服务,在代码后面有 Web 方法。我还有一个额外的.cs文件,其中包含这些网络方法中使用的各种类。到目前为止一切顺利,对吧?

然后我有一个额外的网络服务,仅用于测试东西。它没有隐藏的代码,其代码直接位于 .asmx 文件中,因此我可以快速将其上传到服务器而无需重建任何内容。此测试 Web 服务与第一段中提到的 Web 服务位于同一MyNamespace命名空间中,并且也位于同一项目中。它工作得很好,直到我尝试访问MyNamespace的内部成员。这是不可能做到的,它们是隐形的,就好像它们是私人的一样。

这就是我可能会开始写废话的地方,所以如有必要,请纠正我。我环顾四周,这似乎是"有意的",因为没有适当代码的 .asmx 是在运行时编译的,而不是正确程序集的一部分。由于内部成员仅在程序集中可用,因此它们在我的 .asmx 代码中不可用是完全正确的。那么我的问题是 - 我可以在不将代码移动到 .asmx.cs 代码隐藏文件的情况下以某种方式访问这些成员吗?

访问 Web 服务中的内部类和方法,无需隐藏代码

我想这可以通过反射来实现。

例如:在公共类上调用内部方法:

var myPublicClass = new PublicClass;
MethodInfo mInfo = typeof(PublicClass).GetMethod("InternalMethodName", BindingFlags.Instance | BindingFlags.NonPublic);
var result = mInfo.Invoke(myPublicCLass, null) // (replace null with an array of parameters if necessary)

或者在内部类的实例中创建:

MethodInfo mInfo= Type.GetType(assemblyQualifiedName).GetConstructor(
                        BindingFlags.NonPublic | BindingFlags.Instance,
                        null,
                        new[] { typeof(string) },
                        null
                    );
object myInstance = mInfo.Invoke(new[] { "constructorArgument" });
编辑:内部

静态类上的内部静态方法:

MethodInfo mInfo = Type.GetType(assemblyQualifiedName).GetMethod("InternalMethodName", BindingFlags.Static| BindingFlags.NonPublic);
var result = mInfo.Invoke(null, null) // (replace 2nd null with an array of parameters if necessary)