在进行一个应用程序开发时,会产生哪些文件

在进行一个应用程序开发时,会产生哪些文件,第1张

以下针对Net

基本的文件类型:

1 csproj/vbproj 等项目文件

2 sln 解决方案文件

3 suo 解决方案设置文件

4 user 项目信息配置

5 cs/vb 等源代码文件

6 resx 等资源文件

7 exe/bin 等编译后的程序集或引用的程序集文件

8 snk 强命名文件

9 xml 配置文件或编译后的智能提示

10config 配置文件

11pdb 调试符号信息文件

12jpg/png 等资源文件

事实上一个项目能包含任意类型的文件,上面只是一部分常见的。

开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了。

这里需要用到一款名为FodyCostura的工具。FodyCostura是一个Fody框架下的插件,可通过Nuget安装到VS工程中。安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打包到EXE文件里。

使用方法

在VS中,通过Nuget为目标EXE工程安装CosturaFody。

重新构建项目。

构建完成后,到项目的输出目录下找到新生成的EXE文件,你同时会发现输出目录下仍然存在那些DLL。不过不用担心,这个EXE已经能够独立运行了。你可以把这些DLL全部删除后再运行EXE试试。

另外,FodyCostura还支持一些进阶的特性,例如:

临时程序集文件:在运行EXE前自动,自动将DLL从EXE中解压到文件夹系统中,再通过常规的方式加载该DLL。

合并非托管的DLL:FodyCostura可以合并非托管的DLL,但是不会自动合。如果你的程序涉及非托管DLL,那么你需要通过修改FodyCostura的配置文件来显示地告诉它你想合并哪些非托管的DLL。

预加载DLL:FodyCostura可以帮助你在程序启动时预先加载某些DLL,甚至可以指定这些DLL的加载顺序。

以上这些进阶特性都需要你通过修改FodyCostura的配置文件来实现,具体的 *** 作步骤可以参考它的官方文档。

实现原理介绍

当CLR试图加载一个程序集但加载失败时,它会引发AppDomainAssemblyResolve事件。我们的程序可以监听这个事件,并且在这个事件的处理函数中返回这个CLR试图加载的程序集,从而使程序得以继续正常运行。

FodyCostura在构建项目时会把EXE引用到的DLL全部嵌入到EXE文件中。当程序在运行的过程中用到其中某个DLL的时候(此时由于CLR无法找到该DLL文件,导致AppDomainAssemblyResolve事件被触发)再从EXE文件的嵌入资源中提取所需的DLL。

下面这两个函数就是FodyCostura实现这部分逻辑的代码。

public static void Attach()

{

var currentDomain = AppDomainCurrentDomain;

currentDomainAssemblyResolve += (s, e) => ResolveAssembly(eName);

}

public static Assembly ResolveAssembly(string assemblyName)

{

if (nullCacheContainsKey(assemblyName))

{

return null;

}

var requestedAssemblyName = new AssemblyName(assemblyName);

var assembly = CommonReadExistingAssembly(requestedAssemblyName);

if (assembly != null)

{

return assembly;

}

CommonLog("Loading assembly '{0}' into the AppDomain", requestedAssemblyName);

assembly = CommonReadFromEmbeddedResources(assemblyNames, symbolNames, requestedAssemblyName);

if (assembly == null)

{

nullCacheAdd(assemblyName, true);

// Handles retargeted assemblies like PCL

if (requestedAssemblyNameFlags == AssemblyNameFlagsRetargetable)

{

assembly = AssemblyLoad(requestedAssemblyName);

}

}

return assembly;

}

可以看到,Attach方法监听了AppDomainAssemblyResolve事件。当CLR无法成功加载某个程序集时, AssemblyResolve事件处理函数会被执行。AssemblyResolve会尝试通过CommonReadFromEmbeddedResources方法从已加载的程序集的嵌入资源中获取目标程序集,并返回给CLR。

对于C#语言来说,CLR隐藏了一个大招——CLR可以在每个模块(每个程序集都含有一个或多个模块)加载之前执行一些初始化的代码。但是很遗憾,C#语言无法控制这部分代码。FodyCostura则是在内部将IL代码直接注入到EXE程序集内部模块的初始化函数中,而这部分IL代码其实就是执行了Attach方法。这样一来,EXE程序集被加载后,Attach方法就能够立即得到调用了。

可以通过多种方式将

程序集

加载到

应用程序域

中。推荐方式是使用

System

Reflection

Assembly类的static(在

Visual

Basic

中为Shared)Load方法。加载程序集的其他方式包括:Assembly类的LoadFrom方法加载已给定其文件位置的程序集。通过此方法加载程序集将使用不同的加载上下文。

ReflectionOnlyLoad和ReflectionOnlyLoadFrom

将程序集加载到仅反射上下文中。

注意仅反射上下文是

NET

Framework

20

版中的新增功能。

诸如CreateInstance方法和AppDomain类的CreateInstanceAndUnwrap

之类的方法可将程序集加载到应用程序域中。

Type类的GetType方法可加载程序集。

SystemAppDomain类的Load方法可以加载程序集,但该方法主要用于

COM

互 *** 作性

。不应使用该方法将程序集加载到除从其调用该方法的应用程序域以外的其他应用程序域。

注意从

NET

Framework

20

版开始,对于版本号高于当前已加载运行库的

NET

Framework

版本,运行库将不加载由其进行编译的程序集。这同样适用于主版本号和次版本号的组合。

可以指定在应用程序域间共享来自已加载程序集的实时

(JIT)

编译代码的方式。有关更多信息,请参见

应用程序域和程序集。

示例下面的代码将名为exampleexe或exampledll的程序集加载到当前应用程序域中,从该程序集获取名为Example的类型,为该类型获取名为MethodA的无参数方法,然后执行该方法。有关从所加载程序集中获取信息的完整讨论,请参见动

态加载和使用类型。

程序集是经由编译器编译得到的,供 CLR 进一步编译执行的那个中间产物。它一般表现为 dll 或者是 exe 的格式,但是要注意,它们跟普通意义上的 WIN32 可执行程序是完全不同的东西,程序集必须依靠 CLR 才能顺利执行。程序集是 NET 编程的基本组成部分。

此示例测试 DLL 是否为程序集:

GetAssemblyName 方法会先加载测试文件,然后在读取信息后释放。

与 GetAssemblyName 方法不同,PEReader 不会在本机可移植可执行文件(PE)上引发异常。这使您能够在需要检查此类文件时避免异常导致的额外性能成本。如果文件不存在或不是PE文件,您仍然需要处理异常。

循环判断首 ()

标准输出 (, “请输入一个数:”)

a = 标准输入 ()

如果真(a=“q”)

跳出循环()

标准输出 (, “请再输入一个数:”)

b = 标准输入 ()

如果真(b=“q”)

跳出循环()

标准输出 (, “两个数的和为:” + 到文本 (到数值 (a) + 到数值 (b)) + #换行符 + #换行符)

标准输出 (, “按Q键退出计算!”)

c = 标准输入 ()

如果真(c=“q”)

跳出循环()

循环判断尾 (c ≠ “ Q” 且 c ≠ “ q”)‘设置成死循环 按q跳出循环’

返回 (0)

以上就是关于在进行一个应用程序开发时,会产生哪些文件全部的内容,包括:在进行一个应用程序开发时,会产生哪些文件、c#如何把一个main()和若干个dll打包生成单一的exe文件、C#如何将程序集加载到应用程序域中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9727891.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存