程序集

程序集

C#中,我们要使用反射,主要有三个方面:

第一,反射程序集,模块,类的成员以及成员的一些信息;

第二,接下来就是动态调用类的成员方法;

第三个方面就动态产生程序集,模块和类以及类的成员。

我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:

System.Reflection命名空间

AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器

Assembly:程序集类

Module:模块类

Type:使用反射得到类型信息的最核心的类

他们之间是一种从属关系,也就是说,一个AppDomain可以包含NAssembly,一个Assembly可以包含NModule,而一个Module可以包含NType.

在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFromLoadWithPartialName三个Assembly的静态方法.

先来看Assembly.Load方法,该方法会有多个重载版本,其中一个就是提供程序集的详细信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记,全部都是以一个字符串的形式提供,例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f.

那么,使用Assembly.Load加载程序集的顺序是怎样的呢?首先它会去全局程序集缓存查找,然后到应用程序的根目录查找,最后会到应用程序的私有路径查找。

当然,如果你使用的是弱命名程序集,也即只给出程序集的名称,那么这个时候,CLR将不会在程序集上应用任何安全或者部署策略,而且Load也不会到全局缓存程序集中查找程序集。

       测试加载弱命名程序集的例子如下:

(1)   新建一个控制台应用程序的工程,同时勾选创建解决方案

(2)   在解决方案中新建一个类库的项目,随便写一个类和一个方法

(3)   在控制台项目中,首先不添加引用,直接在Main方法中添加如下代码:

Assembly assembly = Assembly.Load("MyAssembly");

        if (assembly != null)

        {

            Console.WriteLine("加载成功");

         }

执行程序,会抛出异常,说找不到该程序集。什么原因呢?因为我们使用的是弱命名程序集,Load方法不会去全局程序集缓存中查找,而该应用程序目录下又没有该程序集,所以程序找不到。这个时候,我们把程序稍微改一下,不用添加代码,只需添加对MyAssembly的引用,重新运行程序,加载成功了。

      接下来,我们就要看看Load怎么加载强命名程序集了,这个步骤稍微有些复杂。还是刚才的项目,找到MyAssembly.dll程序集所在的目录,一般在bin"Debug目录下

(1)生成密钥对文件

sn –k MyAssemblyKey.keys

你也可以自己随便起一个密钥对文件名

(2)生成公钥文件

sn –p MyAssemblyKey.keys MyAssemblyPublicKey.PublicKey

注:查看公钥命令:sn tp MyAssemblyPublicKey.PublicKey

(3)创建强命名程序集。

很简单,只需要在声明命名空间的那句代码上加上如下特性:

[assembly:AssemblyKeyFileAttribute(@”D:"Test"MyAssemblyKey.keys”)]

(4)   编译项目

(5)   将程序集添加到程序集全局缓存

gacutil –i MyAssembly.dll

这个时候,转到加载程序集的项目中,将Load方法中的参数改为”程序集名,Version=版本,culture=区域信息,PublicKeyToken=公钥“,然后再去掉对程序集的引用,我们会发现,程序运行成功。表明Load到全局缓存区查找到了该程序集。

       使用Load方法加载程序集,特别是强命名程序集,能在程序集上应用安全和部署策略,推荐使用该方法动态加载程序集,至于LoadFromLoadWithPartialName

转载于:https://www.cnblogs.com/blogbai/archive/2012/09/28/2706710.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从像素坐标到相机坐标_【视觉知识】机器视觉几何坐标概论

作者:林青春来源:知乎一、机器视觉几何坐标概论机器视觉系统有三大坐标系,分别是:1、世界坐标系,2、摄像机坐标系,3、图像(像素)坐标系。1、世界坐标系世界坐标系(Xw,Yw,Zw)是目标物…

php 对象 数量,php – Symfony2 / Doctrine如何在实体中存储相关对象的数量

我已经设置了一个包含测试对象的包,该对象包含许多testQuestion对象,每个对象都是一个问题和给定的答案(如果没有答案则为0).从树枝上我希望能够从测试对象中获取信息,说明有多少问题以及已经回答了多少问题.我创建了一个查询来将其从数据库中拉出来,在测试实体中我创建了2个新…

GNU make manual 翻译( 一百六十)

继续翻译 The only restriction on this sort of use of nested variablereferences is that they cannot specify part of the name of a functionto be called. This is because the test for a recognized function nameis done before the expansion of nested references.…

vb如何嵌套chrome_译丨如何为开源软件做出贡献

原文:How to Contribute to Open Source Software作者:Matt Eland译者:博轩为保证文章的可读性,本文采用意译,转载请保留原文链接前段时间参加了2020年1月11日Node party线下分享,justjavac 大佬分享的主题…

反转一个单链表,分别以迭代和递归的形式来实现

迭代法&#xff1a; 1 // 反转单链表.cpp : 定义控制台应用程序的入口点。2 3 #include "stdafx.h"4 #include <stdlib.h>5 6 typedef struct node7 {8 int data;9 struct node *next; 10 }linknode,*linklist; 11 12 linknode *reverse(linknode *he…

codesys中打开linux端的串口_CODESYS版本3.5 SP14 Patch 3发布

此版本有以下内容更新主要功能概述&#xff1a;CODESYS Engineering改进了智能输入辅助、监视列表、监视、 CPU负载、编译调试等;新的数据类型&#xff1a;LREAL或REAL中的__VECTOR [3];用于同步任务特别是多核架构的的原子操作符;一般改进&#xff1a;在源代码中的设备树、全局…

java解析md文件,mavon-editor 存储md文件以及md文件解析成html文件

1、md文件的存储javascript由于是vue-cli项目&#xff0c;因此使用的是mavonEditor.css使用方法&#xff1a;vue首先安装&#xff1a;javanpm install mavon-editor --save而后在相应的组件里引用&#xff1a;git//引入import {mavonEditor} from mavon-editorimport mavon-edi…

合并果子(Vijos P1097)

刚刚做出这道题&#xff0c;感觉很兴奋啊&#xff0c;对于我这种弱菜来说能完美的AC这道题真是令人振奋不已啊&#xff01; &#xff08;情不自禁的将AC记录发上来了&#xff0c;勿怪勿怪&#xff01;&#xff09; 这道题是我们向总点名要做的&#xff0c;这几天学了很多新内容…

vim 删除行_【收藏】138条 Vim 命令、操作、快捷键全

关注我&#xff0c;你的眼睛会怀孕命令历史以:和/开头的命令都有历史纪录&#xff0c;可以首先键入:或/然后按上下箭头来选择某个历史命令。启动vim在命令行窗口中输入以下命令即可vim 直接启动vimvim filename 打开vim并创建名为filename的文件文件命令打开单个文件vim file同…

matlab 按钮组设置,MATLAB中的单选按钮和按钮组

MATLAB GUI中的单选按钮和按钮组matlabGUI界面中的单选(radiobutton)按钮不提供互斥功能&#xff0c;要通过程序实现。方法一&#xff1a;假设有3个radiobutton&#xff0c;分别为radiobutton1、radiobutton2、radiobutton3。radiobutton1的回调函数&#xff1a;functionradiob…

十年只为一个摧残的梦(转载)

第一篇《十年只为一个摧残的梦》 一&#xff1a; 这10年&#xff0c;一定要有自己的方向 1.没有方向感&#xff0c;是最要命的 2.不管起点有多低&#xff0c;都要坦然接受  3.围绕自己的兴趣爱好选择职业 4.做自己最擅长的事 5.从最容易实现的目标开始做起 二&#xff1a; 这…

mysql的join算法,Mysql Join 连接算法

Join 语句的两种算法&#xff0c;分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。直接使用join mysql 优化器自动选择 驱动表。从驱动表读入数据&#xff0c;然后根据连接字段&#xff0c;根据条件匹配被驱动表&#xff0c;然后返回结果集&#xff0c;重…

vlookup练习_那个vlookup,我总是学不会啊

在Excel函数中&#xff0c;有那么的一个万金油Excel函数&#xff0c;它既可以正向查找&#xff0c;逆向查找&#xff0c;还可以多条件查找&#xff0c;它就是Vlookup。Vlookup与IF、sumifs/countifs誉为四大必学Excel函数。以下内容节选自【快速入门Excel基础教程】中的第4-2章…

php 数组课件,php学习 数组课件

下标&#xff1a;数组中的识别名称 也就是字符串或整数在数组中的代号数组中有几个索引值就被称为几维数组。索引值&#xff1a;索引是对数据库表中一列或多列的值进行排序的一种结构。数组分类在PHP数组被分为两种&#xff1a;索引数组&#xff1a;索引(indexed)索引值是整数&…