- 浏览: 518431 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 2231【主要内容】@将源代码 ... -
strong-named
2010-10-26 14:48 876前段时间自己整理的一个有关strong-named assem ... -
CLR笔记(二)
2010-10-26 13:53 9826.类型和成员基础 1.Class的可见性有publi ... -
CLR笔记(一)
2010-10-26 13:22 18041.CLR的执行模型 ... -
Java调用C#
2010-10-25 22:49 1838Java调用C# 下载: http://www.co ... -
Managed Extensions for C++ Reference
2010-10-25 18:10 1389Managed Extensions for C++ Refe ... -
注入托管代码
2010-10-25 17:18 1721前言:本文的重点不在 ... -
jni调用dll及dll已用其它dll的资料
2010-10-25 16:00 899http://blog.csdn.net/KONGKONGWJ ... -
C# method calls within a Java program
2010-10-23 16:11 1066.net产生的比java晚,其类库的封装在某些方面也比ja ... -
走近COM Interop
2010-10-23 15:40 1637走近COM Interop—— RCW ... -
get chartobjects from VB.net
2010-10-18 10:34 1341Excel.Sheets sheets = oWB.Works ... -
VB.NET调用DLL实现方法解析
2010-10-13 10:43 3510VB.NET开发平台 ... -
VB.net 的Me My MyBase MyClass
2010-10-11 23:46 2014第一次接触 Visual Basic 中的 Me、My、M ... -
使用.Net访问Office编程接口(PIA和IA的区别)
2010-10-11 10:25 3501在这篇文章里面,我将向大家介绍如何在.Net中访问Offi ... -
Exposing .net Components to Com
2010-10-11 09:47 813http://www.codeproject.com/KB/C ... -
.net Com组件注册
2010-10-11 09:30 1962本文将详细为大家介绍一个java调用.net DLL的方法,以 ... -
vb.net 封装组件成com的方法
2010-10-10 17:16 1539前几天一直在研究如何将.net的组件封装成com供非托管代码调 ... -
Writing an Activex control in VB.net
2010-10-09 22:33 1407The problem with that example i ... -
VB set Excel color
2010-10-08 17:30 938Sub Macro3()'' Macro3 Macro' ' ...
相关推荐
在.NET框架中,程序集(Assembly)和托管模块(Managed Module)是两个核心概念,它们在构建和运行基于.NET的应用程序时起着至关重要的作用。 程序集是.NET平台上的一个逻辑单元,它封装了代码、资源和元数据,形成...
标题中的“向进程注入托管程序集(Hook ReadProcessMemory Api)(C#源码)”涉及到的是在Windows操作系统中,通过编程手段动态地将托管代码(即.NET Framework中的C#代码编译后的程序集)注入到其他正在运行的进程中,...
【描述】:“Tool for injecting a "TCP Relay" managed assembly into an unmanaged process”表明这个工具设计的目标是将一个特定的TCP Relay功能模块(一个托管的.NET程序集)整合到一个非托管的、原生的Windows...
2. **模块定义**:程序集由一个或多个模块组成。通过AssemblyBuilder.DefineDynamicModule方法定义模块,并指定模块的名称。 3. **类型定义**:在模块中定义类或结构,使用TypeBuilder类。你可以设置类型的基本属性...
.NET中的模块实际上是Windows的PE(Portable Executable)文件,它们包含了CLR(Common Language Runtime)文件头,提供了关于模块和程序集的信息,如CLR版本和可能的托管应用程序入口。PE文件格式允许高效地存储和...
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...
程序集是一个或多个托管模块的集合,包含了类型定义、资源文件和元数据。 CLR 负责将托管模块编译成本地 CPU 指令,并执行验证以确保代码的安全性。.NET 框架类库(Framework Class Library,简称 FCL)提供了一些...
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...
程序集是由一个或多个托管模块以及资源文件组成的逻辑组合。一个程序集包含一个清单(manifest),用于描述组成程序集的所有文件。程序集是CLR直接操作的对象,它包含所有必要的信息,使得程序集能够自我描述,便于...
1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合。 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位。 3.程序集是包含一个或者多个类型定义文件和资源文件的集合。在程序集包含...
与.Net程序集通信的原始ISAPI模块的示例 使用方法: 在RawIsapi.cpp设置(当前为硬编码)路径以指向托管dll。 生成项目。 指向包含web.config文件的文件夹的新IIS站点 将网站的应用程序池设置为“ Classic且No ...
托管模块可以合并成程序集,程序集是逻辑上的分组,可以包含多个模块和资源,并具有版本控制和安全特性。CLR在运行时加载程序集,通过JIT编译IL代码为本地代码,以实现高效执行。 在理解CLR的基础上,我们还需要...
理解如何使用`AppDomain`来加载和卸载程序集是开发可扩展性和热插拔模块的关键。本文将深入探讨这个主题,并提供与C#、.NET、Visual Studio 2013以及设计和架构相关的实践指导。 首先,我们来讨论`AppDomain`的作用...
在Android中,WiFi服务通常由系统服务进程托管,并提供Java接口供应用程序调用。JNI(Java Native Interface)用于连接Java代码和本地C/C++代码,这对于执行特定硬件操作或性能优化至关重要。 三、WCN-SS软件架构 ...
6. 模块文件的元数据中包含了本模块的代码和数据类型信息,但不包含程序集名称或引用的文件列表。 7. .NET异常处理特性中,异常对象不是32位整型值,且可以跨语言捕获,但不能跨进程边界抛出和捕获。 8. MyClass的...
#### 1.2 将托管模块合并成程序集 程序集是.NET Framework中代码的逻辑单元,可以是一个可执行文件或动态链接库(DLL),包含了一个或多个模块和相关的资源文件。程序集不仅包含了代码,还包括了元数据,用于描述...
程序集是由一个或者多个托管模块以及 资源文件等共同组成的,C#编译器(csc.exe)再把源码编程成IL代码和元数据的时候,会进一步连同资源文件合并成程序集, 实际上就是个PE32文件,里面包含一个清单文件 和多个托管...
程序集(assembly)是.NET中的可部署单元,它可能是单个托管模块或多个模块的集合,以及资源文件。清单(manifest)描述了程序集的组成,确保了组件的版本管理和重用性。当运行一个EXE程序集时,CLR会根据嵌入的特殊...
MixedAssembly:使用C ++ / CLI(一种C ++版本,可以在每个模块甚至每个功能的基础上混合非托管机器代码和托管MSIL代码)加载程序集。 文档: : Shellcode:用于通过本机Shellcode注入.NET程序集的各种PIC或工具...
配置文件通常与程序集同目录存放。因此,根据题目给出的选项,本题的正确答案是 B。 - **扩展知识**:配置文件的命名规则通常是 `<AssemblyName>.config`,例如题目中的 `MyWork.dll` 的配置文件应命名为 `MyWork....