首页 > 编程语言 >[From 2.4]C#编译器和程序集链接器(以及一些它们的命令开关)

[From 2.4]C#编译器和程序集链接器(以及一些它们的命令开关)

时间:2023-03-04 12:44:27浏览次数:50  
标签:文件 C# 程序 开关 编译器 netmodule 2.4

原文:https://blog.csdn.net/weixin_30481087/article/details/96836436 C#编译器:(用csc命令来使用C#编译器) 程序集链接器(Assembly Linker):(用al命令来使用C#编译器) 除了使用C#编译器,还可以使用”程序集链接器“使用程序AL.exe来创建程序。 1.如果程序集要包含由不同编译器生成的模块(而且这些编译器不支持与C#编译器的/addmodule)。 2.可用AL.exe生成只含资源的程序集,也就是所谓的附属程序集(satellite assembly),它们通常用于本地化。(例子3) 3.能生成EXE文件,或者生成只包含清单(对其他模块中的类型进行描述)的DLL PE文件。(例子4)     C#编译器支持开关:

  1. /t[arget]:exe,/t[arget]:winexe,/t[arget]:appcontainerexe,/t[arget]:library或者 /t[arget]:winmdobj.所有这些开关都会造成编译器生成含有清单元数据表的PE文件,这些开关分别生成CUI执行体,GUI执行体,Windows Store执行体,类库或者WINMD库。
  2. 除了这些开关, /t[arget]:module:C#编译器还支持/t[target]:module开关,这个开关指示编译器生成一个不包含清单元数据表的PE文件。这样生成的肯定是一个DLL PE文件。CRL想访问其中的任何类型,必须先将该文件添加到一个程序集中。使用/t:module开关时,C#编译器默认为输出文件使用 .netmodule扩展名 (例子1)
  3. /addmodule:可通过许多方式将模块添加到程序集,如果用C#编译器生成含清单的PE文件,可以使用/addmodule开关。 (例子2)
  4. /r[eference]:客户端代码必须使用XXX.dll编译器开关生成,才能使用XXX.dll的程序集的类型。
  5. /resource(C#编译器独有,相当于al的/embed[resource]):/resource开关将指定的资源文件嵌入最终生辰的程序集PE文件中,并更新ManifestResouceDef表,
  6. /linkresouce(C#编译器独有,相当于al的/link[resource]);/linkresouce开关在ManifestResourceDef和FileDef清单表中添加记录项来引用独立存在的资源文件。
  AL.exe(程序集链接器)支持:(C#编译器一些支持的AL.exe也支持) /embed[resource](AL独有):用AL.exe创建程序集时,可用/embed[resource]开关将文件作为资源添加到程序集。该开关获取任意文件,并将文件内容嵌入最终的PE文件。清单的ManifestResourceDef表会更新以反映新资源的存在。 /link[resource](AL独有):它同样获取包含资源的文件,但只是更新清单的ManifestResource和FileDef表以 反映新资源的存在,指出资源包含在程序集的哪个文件中。资源文件不会嵌入程序集PE文件中:相反,它保持独立,而且必须和其他程序集文件一起打包和部署。 /main:AL.exe还会生成一个小的全局函数,名为__EntryPoint._实际没有多大用处,开发人员只需知道有这个开关就可以了。(例子4) /c[ulture]:text开关指定语言文化。例如“en-US”代表英语文化。   /win32res:指定一个.res文件的路径名。 (C#编译器和程序集链接器共有) /win32icon:指定一个.ico文件的路径名。 (C#编译器和程序集链接器共有)   例子1:csc /t:module RUT.cs 上述命令行指示C#编译器创建名为RUT.netmodule的文件。这是一个标准的DLL PE文件,但是,CLR不能单独加载它。   例子2:csc /out:MutiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs 上述命令行指示C#编译器编译FUT.cs来生成MultiFileLibrary.dll。 由于指定了 /t:library开关,所以生成的是含有清单元数据表的DLL PE文件, /addmodule:RUT.netmodule开关告诉编译器RUT.netmodule文件时程序集的一部分,具体的说,/addmodule开关告诉编译器将文件添加到FileDef清单元数据表,并将RUT.netmodule的公开导出类型添加到ExportedTypesDef清单元数据表   例子3: csc /t:module RUT.cs csc /t:module FUT.cs al /out:MultiFileLibrary.dll /t:library RUT.netmodule FUT.netmodule 这个例子首先创建两个单独的模块即RUT.netmodule和FUT.netmodule。 然后生成第三个文件MultiFileLibrary.dll,它是DLL PE文件(因为使用了/t[arget]:library开关),不包含IL代码,但包含清单元数据表,清单元数据表指出RUT.netmodule和FUT.netmodule是程序集的一部分。最终的程序集由三个文件构成:MultiFileLibrary.dll,RUT.netmodule和FUT.netmodule。程序集链接器不能将多个文件合并成一个文件。   例子4: csc /t:module /r:MultiFileLibrary.dll Program.cs al /out:Program.exe /t:exe /main:Program.Main Program.netmodule 第一行将Program.cs文件生成为Program.netmodule文件。第二行生成包含清单元数据表的Program.exe PE文件。此外,由于使用了/main:Program.Main命令行开关,AL.exe还会生成一个小的全局函数名为__EntryPoint。(这个函数只是调用了一下在Program.netModule文件定义的Program类型中包含Main方法。并没有什么意义,开发者只需要知道由这个开关就可以了。)  

转载于:https://www.cnblogs.com/TheChenLin/p/10190289.html

标签:文件,C#,程序,开关,编译器,netmodule,2.4
From: https://www.cnblogs.com/bruce1992/p/17178091.html

相关文章

  • Spring Boot @Scheduled 是同步还是异步,单线程还是多线程?
    @schedule刚开始用的时候回遇到一些坑,主要就是他的同步、异步、多线程的配置问题,这篇文章介绍了@schedule的使用方法,读者遇到问题时可以参考下。1.问题@schedule注解默......
  • 第2章 C语言提高专题篇
    指针入门到精通(一)指针是什么​ 如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元,编译系统根据程序中定义的变量类型,分配一定长度的空间​ ......
  • acwing 297 赤壁之战
    给定一个长度为n的序列,求它有多少个长度为m的严格递增子序列。  f[i][j]+=f[i-1][k](a[k]<a[i],k<i)  优化:维护前缀和,根据a[k]<a[i] ,以a[]为下......
  • leetcode-1154-easy
    DayoftheYearGivenastringdaterepresentingaGregoriancalendardateformattedasYYYY-MM-DD,returnthedaynumberoftheyear.Example1:Input:date......
  • leetcode-1185-easy
    DayoftheWeekGivenadate,returnthecorrespondingdayoftheweekforthatdate.Theinputisgivenasthreeintegersrepresentingtheday,monthandyea......
  • 汇川AM401(Scanner) 和Easy521 (Adapter)的EIP通信
    1,导出Easy系列的EDS文件,配置Easy521的收发字节大小  2,导入Easy系列的EDS文件,配置AM401的收发字节大小    3,AM401作为Scanner的EIP通讯诊断代码......
  • leetcode-1528-easy
    ShuffleStringYouaregivenastringsandanintegerarrayindicesofthesamelength.Thestringswillbeshuffledsuchthatthecharacterattheithposi......
  • leetcode-1470-easy
    ShuffletheArrayGiventhearraynumsconsistingof2nelementsintheform[x1,x2,...,xn,y1,y2,...,yn].Returnthearrayintheform[x1,y1,x2,y2,...,xn,yn]......
  • F. Timofey and Black-White Tree 2100 (树 根号分治 思维)
    https://codeforces.com/problemset/problem/1790/F题意:给定一棵树,需要将其染为全黑,初始时只有一个点为黑色,给定一个序列c,按招顺序染色,要求每次染色后给出当前任意两黑点......
  • NET6 使用 Pomelo.EntityFrameworkCore.MySql,无法从“string”转化为Microsoft.Entity
    NET6使用Pomelo.EntityFrameworkCore.MySql,无法从“string”转化为Microsoft.EntityFrameworkCore.ServerVersion。关于net6使用了6.0版本Pomelo.EntityFrameworkCor......