.NET程序生成打包部署及其简单配置管理

现说一下c#命名行编译器的大体用法。比如想编译一个Program.cs文件我们可以这样写:

csc.exe   / out :Program.exe                                               其他选项默认即可,默认生成控制台程序
csc.exe 
/ out :Program.exe  / t:winexe                                生成GUI程序
csc.exe 
/ out :Program.dll  / t:library                                   生成动态链接库
csc.exe 
/ out :Program.exe  / t:winexe  / r:mylib.dll              指定需要引用的其他程序集
 

元数据是一个二进制数据块,它由几个表构成。这些表分为3个类别,分别为:定义表,引用表,清单表。常见的元数据定义表有ModuleDef,TypeDef,MethodDef等,引用元数据表AssemblyRef,ModuleRef,TypeRef,MemberRef,我们可以用ILDasm打开一个程序集,然后选择:视图|元信息|显示!即可查看一个程序集的这些元数据信息。

下面简单的看一个程序集的元数据情况:

TypeDef # 1  ( 02000002 )
TypDefName: Program (
02000002 )
Flags : [Public] [AutoLayout] [Class] [Sealed] [AnsiClass]
[BeforeFieldInit] (
00100101 )
Extends : 
01000001  [TypeRef] System.Object
---------------------------------------------------------------------------------------------------
Method #
1  ( 06000001 ) [ENTRYPOINT]
MethodName: Main (
06000001 )
Flags : [Public] [Static] [HideBySig] [ReuseSlot] (
00000096 )
RVA : 
0x00002050
ImplFlags : [IL] [Managed] (
00000000 )
CallCnvntn: [DEFAULT]
ReturnType: Void
No arguments.
--------------------------------------------------------------------------------------------------------
Method #
2  ( 06000002 )
MethodName: .ctor (
06000002 )
Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName]
[RTSpecialName] [.ctor] (
00001886 )
RVA : 
0x0000205c
ImplFlags : [IL] [Managed] (
00000000 )
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
--------------------------------------------------------------------------------------------------------------
TypeRef #
1  ( 01000001 )
Token: 
0x01000001
ResolutionScope: 
0x23000001
TypeRefName: System.Object
------------------------------------------------------------------------------------------------------------
MemberRef #
1  (0a000004)
Member: (0a000004) .ctor:
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
--------------------------------------------------------------------------------------------------------------
TypeRef #
2  ( 01000002 )
Token: 
0x01000002
ResolutionScope: 
0x23000001
TypeRefName: System.Runtime.CompilerServices.CompilationRelaxationsAttribute
-------------------------------------------------------------------------------------------------------------------------------------------
MemberRef #
1  (0a000001)
Member: (0a000001) .ctor:
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
1  Arguments
Argument #
1 : I4

由于.NET程序集的字描述性,他不需要特别的打包,直接复制即可。要卸载时直接删除文件,不会留下任何垃圾。

要想实现对一个应用程序的管理控制,可以在程序目录中放置一个XML的配置文件,名字叫App.exe.config,注意名字不能随便更改,就可以在这里面写一些基本的配置。

<? xml version="1.0" ?>
   
< configuration  xmlns ="http://schemas.microsoft.com/.NetConfiguration/v2.0" >
      
< connectionStrings >
          
<!-- vs自动产生的连接字符串.(1) -->
          
< add  name ="AAA"  connectionString ="Data Source=xxx;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx"  providerName ="System.Data.SqlClient"   />
      
</ connectionStrings >
 
      
< appSettings >

          
<!-- 自定义变量(2) -->
          
< add  key ="strConnection"  value ="key1value" />
          
< add  key ="name1"  value ="key2value" />
     
</ appSettings >
 
     
< system .web >
         
< compilation  defaultLanguage ="vb"  debug ="true" >
              
<!-- 在一个VB项目中,如果c#文档(.cs)位于该目录App_Codecsharp
                添加如下设置即可 
-->
             
< codeSubDirectories >
                 
< add  directoryName ="csharp" />
             
</ codeSubDirectories >   
            ...
        
</ compilation >

我们知道.NET程序集有两种部署方式:私有部署和共有部署。前者就是把程序集放到自己设定的目录中,后者则把程序集安装到全局缓冲区中即GAC。公有部署的程序集必须是强类型的。即程序集包括4个重要属性:一个文件名(不带扩展名),一个版本号,一个语言文化,一个公钥。像下面这样的形式:

" MyTypes, Version=1.0.8123.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 "
" MyTypes, Version=1.0.8123.0, Culture= " en - US " , PublicKeyToken=b77a5c561934e089 "
" MyTypes, Version=2.0.1234.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 "
" MyTypes, Version=1.0.8123.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a "

下面看一个如何签名一个程序集的图示:

要想部署到GAC中,不能直接拷贝,需要用Gacutil.exe工具。

下面在看一个CLR如何用元数据来定位定义了一个类型的正确程序集

.NET程序生成打包部署及其简单配置管理_第1张图片

总之.NET程序集的配置策略非常灵活,需要自己去动手尝试。

 

你可能感兴趣的:(.NET程序生成打包部署及其简单配置管理)