- 浏览: 508608 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (299)
- Oracle(pl/sql_Erp_Pro*C) (69)
- 设计模式 (4)
- spring (23)
- ext (17)
- apache开源项目应用 (4)
- jquery (16)
- 生活琐事 (8)
- 下载资源 (23)
- mysql (2)
- Eclipse使用积累 (5)
- 报表类(报表/图表) (13)
- php (4)
- Web多彩文本框 (3)
- json (4)
- jqgrid (2)
- ant (2)
- java算法积累 (8)
- EL表达式/JSTL (4)
- poi (3)
- gwt (2)
- 爬网第一步 (2)
- javascript (17)
- Javaweb (8)
- tomcat (1)
- flex (1)
- Java&DB (3)
- J2SE (7)
- linux (3)
- 数据结构 (1)
- dot net (5)
- struts (1)
- ibatis (1)
- log4j (1)
- 项目管理 (1)
- Java native interface(jni,jacob......) (5)
- applet (1)
- VB.net/C#.net/JNI (20)
- css (1)
- Sqlite (1)
- servlet (1)
- REST (1)
最新评论
-
wenhurena:
能不能给一下解压密码roki.work.2017@gmail. ...
Ebs解体新書と学習資料1 -
liutao1600:
楼主写的太好了,每天学习~~
Spring_MVC(6)测试 -
liutao1600:
太好了,每天学习你的文章~~~
Spring_MVC(3)表单页面处理 -
liutao1600:
学习了,太好了
Spring_MVC(2)控制层处理 -
liutao1600:
学习了~~~
Spring_MVC(1)构建简单web应用
本文是为了学习程序集而整理的网上资料,主要包括两个部分,概念和使用,前部分讲怎样理解程序集,后部分讲述怎样使用的细节。
程序集与托管模块的概念
任何时候构建一个EXE或DLL文件时必须使用/t:library编译参数创建与该应用程序相对应的包含清单(manifest)的程序集,清单(manifest)记录了.NET运行时程序集的相关信息。另外,使用/t:module编译参数,创建一个以.netmodule为扩展名的DLL 文件,这个DLL文件不包含清单。换句话说,虽然逻辑上模块(module)依然是一个DLL文件,但是它不属于程序集,当编译应用程序或使用程序集生成工具(the Assembly Generation tool)时必须使用/addmodule开关将这个DLL文件加入到其他程序集中。 清单数据(Manifest Data) 程序集的清单有不同的方法存储。若编译一个独立的应用程序或DLL文件,清单与程序或DLL的PE结合在一起,这称为单一文件的程序集(single-file assembly)。多文件程序集(multifile assembly)是指清单以另外一个独立实体的形式作为程序集的一部分,或者作为程序集中的一个模块。 同样程序集的定义很大程度取决你如何使用它。从客户的角度来看,程序集是模块、导出类型、(必需、可选)资源的命名和版本化(versioned)的集合。从程序集创建者的角度来看,程序集是客户能使用的一组相关联的模块、类型、资源、导出的方法的封装包(mean of packaging)。也就是说,清单是程序集和用户之间沟通的桥梁。下面列出程序集中清单包含的信息: 程序集的优势 · 程序集的版本 使用程序集另外一个主要优势是程序集内置了版本号。程序集中止了DLL地狱。DLL地狱是指当一个应用程序重写了一个被其他应用程序引用的DLL文件,而该应用程序引用的是低版本的同名DLL文件,这就造成了引用低版本DLL的应用程序运行出错,这种情况。虽然Win32资源文件格式内置了版本资源类型,但是操作系统不会强制执行任何版本控制,以便依赖这个DLL文件的应用程序能正常运行。 基于这个问题,清单不仅包含程序集本身的版本信息,也包含了该程序集所有被引用的程序集和这些程序集的版本信息。因为有了这个体系结构,.NET运行时能确保版本规则被支持,当出现新版本的程序集时,版本不兼容的共享DLLs由操作系统自动安装,使得应用程序可以继续正常运行。 用多个模块创建程序集(Creating Assembies with Multiple Modules) 若要创建一个在多个应用程序使用的程序集,并且版本信息相当重要,则必须共享程序集。若要共享程序集,必须给程序集指定强名称。可以通过.NET SDK提供强名称工具(the Strong Name tool)创建强名称。使用强名称有四个主要理由: · 它是.NET生成唯一的全局名称的机制 · 因为强名称工具生成的密钥对包含了一个签名,你可以判断程序集创建之后是否被篡改。(Because the generated key pair includes a singature,you can tell whether an assembly has been tampered with after its original creation.) · 强名称能防止第三方在你构建的程序集的基础上发表新的版本。这是因为密钥对包含签名起了作用,因为第三方不知道你的私钥。 · 当.NET加载程序集时,运行时会自动验证调用者是否合法。(When .NET load an assembly,the runtime can verify that the assembly came from the publisher that the caller is expecting.) 创建强名称的步骤: · 使用强名称工具为程序集创建一个强名称。示例: sn -k InsideCSharp.key · 在客户端源代码文件中添加属性AssemblyKeyFile,把强名称指定给程序集。 使用全局程序集缓存工作 .NET每次加载程序集时都会创建一个代码缓存区,通常成为全局程序集缓存。使用全局程序集缓存有三个作用: · 存储从Internet或文件服务器下载的代码。注:从一个特定的应用程序加载的代码存储在缓冲中的私有区域,以防止其他程序集访问。 · 存储被多个.NET应用程序共享的组件数据。利用全局缓存工具将程序集加载到缓存全局区域,使得该程序集可以被本地机器的所有应用程序访问。 · 程序集的本地代码是预运行时编译的,同时存储在全局程序集缓存区。(native code versions of assemblies that have been preJITted are stored in the cache.) 缓存视图 1、在windows"assembly文件夹中可以查看程序集的相关信息,如版本号、语言(culture)、公钥标记等等信息。
我相信现在大家对程序集和托管模块分别是什么以及两者间的关系有了较好的理解。但是如果有源代码辅助一下那就更好了。是的。对程序员来说,源代码比什么都亲切。好的,下面就举两个简单的例子(用C#语言表述)。一个是单模块程序集,一个是多模块程序集。两者都是前台程序集(后缀名是exe)。我用Visual C# 2003 集成开发环境试了一下,竟然发现它不支持多程序集的开发(希望是我没有找到)。没关系,我们还有DotNet FrameWork SDK呢,不用怕。它自带的C#编译器csc.exe很好用。至于csc的用法我就不多说了。
/*
*hello.cs 在控制台上显示一行字符串
*/
using System;
namespace nsApp
{
public class CEnterPoint
{
static void Main()
{
Console.WriteLine("Hello, verybody!");
}
}
}
/* Dog.cs */
using System;
namespace nsZoo
{
public class Dog
{
public void SayHello()
{
Console.WriteLine("I am a dog, wang wang wang");
}
}
}
/* Cat.cs */
using System;
namespace nsZoo
{
public class Cat
{
public void SayHello()
{
Console.WriteLine("I am a cat, miao miao miao");
}
}
}
/* Main.cs */
using System;
using nsZoo;
namespace nsApp
{
class CEnterPoint
{
static void Main(string[] args)
{
Dog aDog = new Dog();
Cat aCat = new Cat();
aDog.SayHello();
aCat.SayHello();
Console.ReadLine();
}
}
}
· 程序集名称(Assembly name)
· 版本信息(Versioning information)
版本信息是由四个不同的部分组成的版本号,分别是主版号、子版号、构建序号、修订号。
· (可选的)共享名和带符号的程序集散列(An(Optional)shared name and signed assembly hash)
主要是关于程序集部署的相关信息。
· 文件(Files)
包含在程序集中的文件列表。
· 引用的程序集(Referenced assemblies)
直接引用的外部程序集列表。
· 类型(Types)
程序集内部的所有类型及模块映像包含的类型的列表。(This is list of all types in the assembly with a mappig to containing the type.)
· 安全(Security)
安全权限的列表,权限已明确地被程序集抛弃。(permissions This is a list of security permissions that are explicity refused by the assembly.)
· 定制属性(Custom attributes)
· 产品信息 包含公司、商标、产品及版权信息。
· 程序集的封装:将多个模块封装到一个物理文件,起到性能优化的作用。当你创建一个应用程序并使用多文件程序集时,.NET运行时只需加载相关的模块。这种策略起到减少应用程序的工作集。
· 程序集的部署
在.NET框架中程序集是最小的部署单元。虽然它诱人的说,程序集是部署应用程序的方法,但是技术上并不是如此。许多关于程序集部署的正确的观点是:在.NET中程序集应该看作一个窗体的类部署(class deployment)-就像Win32中的一个DLL文件。一个单独的应用程序是由多个程序组成的。
因为程序集是自描述的(self-desciribing),所以部署程序集最简单的方法就是直接把程序集复制到目的文件夹。当尝试运行包含这个程序集的应用程序时,清单将向.NET运行时提供包含在这个程序集中的方法信息。另外,清单(manifest)也向应用程序提供该程序集所引用的外部程序集的相关信息。
许多通过公共方法部署的程序集依然是私有的程序集,即程序集被复制到文件夹,但它们不是共享的。缺省情况下程序集是私有的,除非明确地指定程序集为共享程序集(shared assembly)。
// NetModuleTestServer.cs
// Build with the following command-line switches:
// csc /t:library NetModuleTestServer.cs
public class NetModuleTestServer
{
public static void Bar()
{
System.Console.WriteLine("NetModuleTestServer.Bar(NetModuleTestServer.netmodule)");
}
}
// NetModuleTestClientApp.cs
// Build with the following command-line switches:
//
// csc addmodule:NetModuleServer.netmodule NetModuleTestClientApp.cs
using System;
using System.Diagnostics;
using System.Reflection;
class NetModuleTestClientApp
{
public static void Main()
{
Assembly DLLAssembly = Assembly.GetAssembly(
typeof(NetModuleTestServer));
Console.WriteLine(""nNetModuleTestServer.dll Assembly " +
"Information");
Console.WriteLine(""t" + DLLAssembly);
Process p = Process.GetCurrentProcess();
string AssemblyName = p.ProcessName + ".exe";
Assembly ThisAssembly = Assembly.LoadFrom(AssemblyName);
Console.WriteLine("NetModuleTestClient.exe Assembly " +
"Information");
Console.WriteLine(""t" + ThisAssembly + ""n");
Console.WriteLine("Calling NetModuleTestServer.Bar");
NetModuleTestServer.Bar();
}
}
// DllTestServer.cs
// Build with the following command-line switches:
// csc /t:library DllTestServer.cs
public class DllTestServer
{
public static void Foo()
{
System.Console.WriteLine("DllTestServer.Foo " +
"(DllTestServer.DLL)");
}
}
// DllTestClient.cs
// Build with the following command-line switches:
// csc DllTestClient.cs /r:DllTestServer.dll
using System;
using System.Diagnostics;
using System.Reflection;
class DllTestClientApp
{
public static void Main()
{
Assembly DLLAssembly =
Assembly.GetAssembly(typeof(DllTestServer));
Console.WriteLine(""nDllTestServer.dll Assembly " +
"Information");
Console.WriteLine(""t" + DLLAssembly);
Process p = Process.GetCurrentProcess();
string AssemblyName = p.ProcessName + ".exe";
Assembly ThisAssembly = Assembly.LoadFrom(AssemblyName);
Console.WriteLine("DllTestClient.exe Assembly " +
"Information");
Console.WriteLine(""t" + ThisAssembly + ""n");
Console.WriteLine("Calling DllTestServer.Foo");
DllTestServer.Foo();
}
}
发表评论
-
.NET程序集
2010-10-26 15:03 2202【主要内容】@将源代码 ... -
strong-named
2010-10-26 14:48 852前段时间自己整理的一个有关strong-named assem ... -
CLR笔记(二)
2010-10-26 13:53 9466.类型和成员基础 1.Class的可见性有publi ... -
CLR笔记(一)
2010-10-26 13:22 17481.CLR的执行模型 ... -
Java调用C#
2010-10-25 22:49 1817Java调用C# 下载: http://www.co ... -
Managed Extensions for C++ Reference
2010-10-25 18:10 1353Managed Extensions for C++ Refe ... -
注入托管代码
2010-10-25 17:18 1700前言:本文的重点不在 ... -
jni调用dll及dll已用其它dll的资料
2010-10-25 16:00 870http://blog.csdn.net/KONGKONGWJ ... -
C# method calls within a Java program
2010-10-23 16:11 1036.net产生的比java晚,其类库的封装在某些方面也比ja ... -
走近COM Interop
2010-10-23 15:40 1594走近COM Interop—— RCW ... -
get chartobjects from VB.net
2010-10-18 10:34 1309Excel.Sheets sheets = oWB.Works ... -
VB.NET调用DLL实现方法解析
2010-10-13 10:43 3427VB.NET开发平台 ... -
VB.net 的Me My MyBase MyClass
2010-10-11 23:46 1987第一次接触 Visual Basic 中的 Me、My、M ... -
使用.Net访问Office编程接口(PIA和IA的区别)
2010-10-11 10:25 3459在这篇文章里面,我将向大家介绍如何在.Net中访问Offi ... -
Exposing .net Components to Com
2010-10-11 09:47 790http://www.codeproject.com/KB/C ... -
.net Com组件注册
2010-10-11 09:30 1931本文将详细为大家介绍一个java调用.net DLL的方法,以 ... -
vb.net 封装组件成com的方法
2010-10-10 17:16 1500前几天一直在研究如何将.net的组件封装成com供非托管代码调 ... -
Writing an Activex control in VB.net
2010-10-09 22:33 1381The problem with that example i ... -
VB set Excel color
2010-10-08 17:30 905Sub Macro3()'' Macro3 Macro' ' ...
相关推荐
程序集 与 托管模块 程序集 与 托管模块 程序集 与 托管模块 程序集 与 托管模块
1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合。 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位。 3.程序集是包含一个或者多个类型定义文件和资源文件的集合。在程序集包含...
IE_RUN- 从IE地址栏里运行程序的模块.ec IMAGE.EC ini40.ec internet2.ec IPbox2.ec IP 地址编辑框2.0.ec jingjian.ec KERNEL.EC kernel模块.EC LED液晶控件模块(红色增强 版).ec Link22.ec Lzj-动态注册ActiveX...
与.Net程序集通信的原始ISAPI模块的示例 使用方法: 在RawIsapi.cpp设置(当前为硬编码)路径以指向托管dll。 生成项目。 指向包含web.config文件的文件夹的新IIS站点 将网站的应用程序池设置为“ Classic且No ...
IE_RUN- 从IE地址栏里运行程序的模块.ec IMAGE.EC ini40.ec internet2.ec IPbox2.ec IP 地址编辑框2.0.ec jingjian.ec KERNEL.EC kernel模块.EC LED液晶控件模块(红色增强 版).ec Link22.ec Lzj-动态注册ActiveX...
程序集是由一个或者多个托管模块以及 资源文件等共同组成的,C#编译器(csc.exe)再把源码编程成IL代码和元数据的时候,会进一步连同资源文件合并成程序集, 实际上就是个PE32文件,里面包含一个清单文件 和多个托管...
MixedAssembly:使用C ++ / CLI(一种C ++版本,可以在每个模块甚至每个功能的基础上混合非托管机器代码和托管MSIL代码)加载程序集。 文档: : Shellcode:用于通过本机Shellcode注入.NET程序集的各种PIC或工具...
程序集 程序集清单 MSIL 元数据 关于PE文件 关于托管模块 关于公钥和私钥加密 C#中的装箱和拆箱 关于接口实现
此存储库托管CodeReady Workspaces程序集,该程序集主要继承Eclipse Che工件并重新打包其中的一些工件: 与上游相比的差异: 定制仪表板(图片,图标,标题,加载程序,链接) 样本和堆栈模块 贝叶斯语言服务器...
与应用程序负载平衡器(ALB)关联 阻止IP集 全球IP速率限制 不同URL的自定义IP速率限制 自2020年12月2日起,AWS GovCloud不支持AWSManagedRulesAmazonIpReputationList托管规则集,该规则集在此模块中默认启用。 在...
托管模块:Managed Module,一个标准的MS Window可移植执行体文件(32位PE32或64位PE32+) IL:Intermediate Language 中间语言,又叫托管代码(由CLR管理它的执行) 元数据:metadata,一系列特殊的数据表 程序集:...
1.2 将托管模块合并成程序集 1.3 加载公共语言运行时 1.4 执行程序集的代码 1.4.1 IL和验证 1.4.2 不安全的代码 1.5 本地代码生成器:NGen.exe 1.6 Framework类库 1.7 通用类型系统 1.8 公共语言规范 1.9 ...
1.2 将托管模块合并成程序集 1.3 加载公共语言运行时 1.4 执行程序集的代码 1.4.1 IL和验证 1.4.2 不安全的代码 1.5 本地代码生成器:NGen.exe 1.6 Framework类库 1.7 通用类型系统 1.8 公共语言规范 1.9 ...
1.2 将托管模块合并成程序集 1.3 加载公共语言运行时 1.4 执行程序集的代码 1.4.1 IL和验证 1.4.2 不安全的代码 1.5 本地代码生成器:NGen.exe 1.6 Framework类库 1.7 通用类型系统 1.8 公共语言规范 1.9 ...
1.2 将托管模块合并成程序集 1.3 加载公共语言运行时 1.4 执行程序集的代码 1.4.1 IL和验证 1.4.2 不安全的代码 1.5 本地代码生成器:NGen.exe 1.6 Framework类库 1.7 通用类型系统 1.8 公共语言规范 1.9 ...
WiX工具集允许开发人员为Windows安装引擎Windows Installer创建安装程序。 WiX的核心是一组构建工具,它们使用与产品其余部分相同的构建概念构建Windows Installer程序包:编译源代码然后链接以创建可执行文件; 在...
使用PySpark并在Colab Notebook中工作,并将AWS S3存储和AWS RDS与托管的PostgreSQL数据库一起使用,对所选数据执行了ETL和转换过程。 分析的目的是确定在Vine付费评论与非Vine计划中的评论之间的评论中是否存在...
也可以单击“注入Dll”将.NET程序集注入到任何进程中。 包含桌面clr或coreclr的任何进程都将标记为绿色。 查看模块 该页面显示了选择过程中的所有模块,您可以通过单击“仅.NET模块”来查看.NET模块。 任何.NET...
多模块程序集 443 专用程序集 451 共享程序集 452 第18章 属性和反射 459 属性 459 反射 466 第19章 封送和远程编程 478 程序域 479 上下文 489 远程访问 491 第20章 线程与同步 503 线程 504 同步 513 竞赛状态和...
多模块程序集 443 专用程序集 451 共享程序集 452 第18章 属性和反射 459 属性 459 反射 466 第19章 封送和远程编程 478 程序域 479 上下文 489 远程访问 491 第20章 线程与同步 503 线程 504 同步 513 竞赛状态和...