MSDN上解释Internal如下:

The internal keyword is an access modifier for types and type members. Internal types or members are accessible only within files in the same assembly.

即, 仅允许相同程序集内的代码调用类型或成员.

那么是否可以调用这些internal的方法呢?

如果被调用的程序集, 在代码中使用了InternalsVisibleToAttribute来标示一个或多个友元程序集, 那么这些被标为友元的程序集就可以访问被调用程序集的internal方法. 下例是程序集A的代码, 它宣布AssemblyB为友元程序集

// This file is for Assembly A.

using System.Runtime.CompilerServices;
using System; [assembly: InternalsVisibleTo("AssemblyB")] // The class is internal by default.
class FriendClass
{
public void Test()
{
Console.WriteLine("Sample Class");
}
} // Public class that has an internal method.
public class ClassWithFriendMethod
{
internal void Test()
{
Console.WriteLine("Sample Method");
} }

更具体的一行代码示例如下:

[assembly: InternalsVisibleTo("AssemblyB, PublicKey=32ab4ba45e0a69a1")]

那么如果我们要调用的是第三方人写的代码里的internal的方法, 怎么办呢?

答案是使用反射.

下面是被调用的类的源代码.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace internalclasstest
{
public class PubClass
{
public void Speak()
{
Console.WriteLine("PubClass speaks: You are so nice!");
} //Internal method
internal void Mock()
{
Console.WriteLine("PubClass mocks: You suck!");
}
} //Internal class
class InternalClass
{
public void Speak()
{
Console.WriteLine("InternalClass speaks: I love my job!");
} void Moci()
{
Console.WriteLine("InternalClass speaks: I love Friday night!");
}
}
}

下面是使用反射并调用PubClass的Internal 函数Mock的代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection; namespace reflectionInternal
{
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFile(@"E:\internalclasstest\bin\Debug\internalclasstest.dll");
Type t1 = asm.GetType("internalclasstest.PubClass"); ConstructorInfo t1Constructor = t1.GetConstructor(Type.EmptyTypes);
Object oPubClass = t1Constructor.Invoke(new Object[] { }); MethodInfo oMethod = t1.GetMethod("Mock", BindingFlags.Instance | BindingFlags.NonPublic);
oMethod.Invoke(oPubClass, new Object[]{});
}
}
}

在C#中使用反射调用internal的方法的更多相关文章

  1. C#通过反射调用类及方法

    反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创 ...

  2. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  3. Java 中父类怎么调用子类的方法?

    父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...

  4. 为什么static方法中不可以调用非static方法

    Java是面向对象的语言,所有的变量,方法都是针对对象而言的.一般来说,要调用一个方法,你需要new 这个方法的对象. 什么时候用static? 如果你想要: 对于一个类的所有对象共享一个变量或者是方 ...

  5. java 使用反射调用可变参数方法

    使用反射操作对象-调用可变参数方法 要把可变参数都当做是其对应的数组类型参数; 如 show(XX... is)作为show(XX[] is)调用; 若可变参数元素类型是引用类型: JDK内部接收到参 ...

  6. 动态修改字节码以替换用反射调用get set方法的形式

    1. 起因 在前两天,为了解决websphere和JDK8上部署的应用发起webservice调用(框架用的cxf)时报错的问题,跟了一些代码,最终发现可以通过加上参数-Dcom.sun.xml.bi ...

  7. ASP.NET4.0中JavaScript脚本调用Web Service 方法

    环境:VS2019  .net 4.0 framework 根据教材使用ScriptManager在JavaScript中调用Web service 时,失败.现将过程和解决方法记录如下: 1.定义W ...

  8. java 通过反射调用属性,方法,构造器

    package reflection2; import static org.junit.Assert.assertArrayEquals; import java.lang.reflect.Cons ...

  9. aspx界面中,怎么调用后台的方法,处理某个数据

    <%# GetUrl(Eval("Url").ToString(),Eval("ID").ToString()) %> GetUrl() 就是后台的 ...

随机推荐

  1. Linux常用命令汇总及使用方法(二)之文本编辑器VI

    VI可能是在Linux中使用比较频繁的文本编辑器,如果不能熟练使用VI,在一定程度上会影响工作效率,所以在这里记录一下VI的常用命令及操作方式 在[root@test ~]# vi carrie.tx ...

  2. Android中的eventBus传值

    第一步:在build.gradle中添加依赖dependencies { compile 'org.greenrobot:eventbus:3.0.0'} 第二步:创建一个 Event类: 注意:en ...

  3. java设计模式(三)

    单例模式在一个jvm中有且仅有一个对象(1)内部静态类实现 class Singleton{ /*构造方法私有 防止实例化*/ private Singleton(){}; public static ...

  4. mac 配置快捷键快速锁屏

    mac下锁屏方式有很多: 快捷键control+shift+power 在其他中打开钥匙串访问,讲屏幕锁定按钮显示在menu bar中 这两种方法存在弊端: 按三个键去锁定屏幕太费劲,况且让使用外接键 ...

  5. CodeForces 698B Fix a Tree

    并查集,构造. 先看一下图的特殊性,按照这种输入方式,一个点的入度最多只有$1$,因此,问题不会特别复杂,画画图就能知道了. 如果给出的序列中已经存在$a[i]=i$,那么随便取一个$a[i]=i$的 ...

  6. linux环境vnc部署过程详解

    vnc服务端机器地址:10.165.38.68 vnc客户端机器地址:本机(windows机器) vnc客户端包:vnc_82537_82537.rar (百度云盘下载地址:http://pan.ba ...

  7. 实验吧Web-FALSE

    笔记: PHP函数isset(): 检测变量是否设置 只能用于变量,传递任何其它参数都将造成解析错误.若想检测常量是否已设置,可使用 defined() 函数 格式:  isset ( mixed v ...

  8. 2016 SyScan360 国际前瞻信息安全会议 多角度探讨信息安全

    SyScan360国际前瞻信息安全会议由与中国第一大互联网安全公司-360公司与SyScan前瞻信息安全技术年会(TheSymposiumonSecurityforAsiaNetwork,以下简称Sy ...

  9. 《JS中的面向对象技术》

    内容要点: 1.什么是对象:JS权威指南学习总结-第六章 ,(有句话:一切都是对象) 2.什么面向对象 使用对象时,只关注对象提供的功能,不关注其内部细节,比如jQuery.面向对象是一种通用思想,并 ...

  10. 【Sort】插入排序

    今晚更新几个排序算法 插入排序,时间复杂度O(n^2),从前往后遍历,每遍历到一个值的时候,其前面的所有值已经完成排序,把这个值插入适当位置 void intersort(int *nums,int ...