我总是在我的C#代码中引用DLL,但它们仍然是一个谜,我想要澄清这一点.这是关于DLL的问题的一种大脑转储.

我知道DLL是一个动态链接库,这意味着另一个程序可以在运行时访问这个库来获得"功能".但是,请考虑下面的具有Web.dllBusiness.dll的ASP.NET项目(Web.dll是前端功能,它引用Business.dll作为类型和方法).

  1. 在什么情况下,Web.dll动态链接到Business.dll?在使用Word(等)时,您会注意到Windows硬盘在处理看似很小的任务时遇到了很多问题.我认为Word正在关闭并动态链接来自其他DLL的功能?

    1a.此外,加载和链接DLL的是操作系统或一些运行时框架,例如.NET框架?

    1b."链接"的过程是什么?是否进行了兼容性判断?加载到同一个内存中?链接到底意味着什么?

  2. 究竟是什么执行DLL中的代码?它是由处理器执行的,还是在处理器理解DLL中的代码之前还有另一个翻译或编译阶段?

    2A.在C#.NET中构建的DLL的情况下,是什么在运行它:.NET框架还是直接运行操作系统?

  3. 来自Linux的DLL是否可以在Windows系统上工作(如果存在这样的功能),或者它们是特定于操作系统的吗?

  4. DLL是否特定于特定的框架?可以使用C#构建DLL.NET被一个DLL所使用,例如Borland C++?

    4a.如果4的答案是"否",那么DLL的意义是什么?为什么不同的框架不使用自己的链接文件格式?例如:安.exe内置.NET知道一个文件类型.abc是一种可以链接到代码中的东西.

  5. 回到Web.dll/Business.dll示例-要获得Customer的类类型,我需要从Web.dll引用Business.dll.这一定意味着Business.dll包含某种关于Customer类实际是什么的规范.比方说,如果我用Delphi编译了我的Business.dll文件:C#会理解它并能够创建一个Customer类吗?或者有没有某种头信息,或者说"嘿,对不起,你只能从另一个Delphi DLL使用我"?

    5A.同样的道理也适用于方法;我可以在DLL中编写一个CreateInvoice()方法,用C++编译它,然后从C#访问并运行它吗?是什么阻止或允许我这么做的?

  6. 关于DLL劫持的问题,替换(坏的)DLL肯定必须包含与被劫持的方法签名和类型完全相同的方法签名和类型.如果您能找出原始DLL中有哪些方法可用,我想这并不难做到.

    6a.在我的C#程序中,什么决定了我是否可以访问另一个DLL?如果我被劫持的DLL包含与原始DLL完全相同的方法和类型,但它是用另一种语言编译的,它会工作吗?

什么是DLL导入和DLL注册?

推荐答案

首先,您需要了解两种非常不同的DLL之间的区别.Microsoft决定对.NET(托管代码)和本机代码使用相同的文件扩展名(.exe和.dll),但是托管代码DLL和本机DLL在内部有very个不同.

1) web在什么时候开始运行.动态链接到业务.dll?你

1) 在这种情况下.NET中,当第一个试图从DLL中访问任何内容的方法被执行时,DLL通常会按需加载.这就是为什么在无法加载DLL的情况下,可以在代码中的任何位置获得TypeNotFoundException.当Word之类的东西突然开始大量访问HDD时,很可能是交换(将已交换的数据放入磁盘以在RAM中腾出空间)

1A)其他加载和链接DLL的对象-操作系统或其他 运行时框架,如.Net框架?

1a)在托管DLL的情况下.NET framework是加载、JIT编译(将.NET字节码编译为本机代码)并链接DLL的工具.对于本机DLL,它是操作系统的一个组件,用于加载和链接DLL(无需编译,因为本机DLL已经包含本机代码).

1b)"链接"的过程是什么?有没有判断过

1b)链接是指调用代码中对DLL中的符号(例如方法)的引用(例如方法调用)被替换为DLL中事物的实际地址.这是必要的,因为在DLL加载到内存之前,无法知道DLL中内容的最终地址.

2) 是什么实际执行DLL中的代码?它会被执行吗

2) 在Windows上.exe文件和.dll文件完全相同.出生地的exe和.dll文件包含本机代码(与处理器执行的内容相同),因此无需翻译.管理.exe和.dll文件包含.NET字节码,这是第一次进行JIT编译(翻译成本机代码).

2a)如果是从C#构建的DLL.net这是什么?这个

2A)在JIT编译代码之后,它以与任何代码完全相同的方式运行.

3) Linux的DLL在Windows系统上工作吗(如果是这样的话)

3) 托管DLL可以按原样工作,只要两个平台上的框架都是最新的,并且编写DLL的人没有故意使用本机调用 destruct 兼容性.本机DLL不会像中那样工作,因为格式不同(即使其中的机器代码相同,如果它们都用于相同的处理器平台).顺便说一下,在Linux上,"DLL"被称为.so(共享对象)文件.

4)它们是否特定于特定的框架?是否可以使用 用Borland C++构建的DLL是否可以使用C#.Net(仅限示例)?

4) 托管DLL是特定于应用程序的.NET框架,但它们自然可以与任何兼容的语言一起工作.只要每个人都使用相同的约定(调用约定(如何在机器代码级别传递函数参数)、符号命名等),本机DLL就可以兼容

5) 回到网络.dll/商业.dll示例.go 上课

5) 托管DLL包含对其包含的每个类、方法、字段等的完整描述.AFAIK Delphi不支持.NET,因此它将创建本机DLL,而这些DLL无法在中使用.直截了当地收网.您可能可以使用PInvoke调用函数,但找不到类定义.我不使用Delphi,所以我不知道它如何用DLL存储类型信息.例如,C++依赖于包含类型声明的头(.h)文件,并且必须与DLL一起分发.

6)关于DLL劫持的问题,肯定是替换(坏的)DLL 必须包含准确的方法签名,类型与 被劫持了.我想这不难做到,如果你能找到 找出原始DLL中可用的方法等.

6) 事实上,如果可以轻松切换DLL,这并不难.代码签名可以用来避免这种情况.为了让某人替换签名的DLL,他们必须知道签名密钥,该密钥是保密的.

这里有点重复的问题,但这又回到了我的 C#程序正在决定我是否可以访问另一个DLL?如果我被劫持的动态链接库 包含与原始文件完全相同的方法和类型,但它 是用另一种语言编译的,可以用吗?

6a)只要它是一个托管DLL,使用任何.网络语言.

  • DLL导入的是什么?还有动态链接库注册呢?

"DLL导入"可能意味着很多事情,通常意味着引用DLL文件并使用其中的内容.

DLL注册是在Windows上完成的,它将DLL文件全局注册为COM组件,以便系统上的任何软件都可以使用它们.

.net相关问答推荐

Azure SignalR 和微服务

是否有内置方法将 nuget 包引用为 csproj 中的文件?

如何在 Raspberry Pi 上托管 WASM 文件?

.NET 4.5 项目未在 Visual Studio 2022 中编译

为什么 GetShortestDayName 返回的名称比预期的短?

是否可以将 SandCastle 创建的两个页面合并到一个主页中?

如何找到 ManualResetEvent 的状态?

什么是 project.lock.json?

将属性序列化为元素中的 Xml 属性

在 C# 中将字符串转换为十六进制字符串

.NET 事件 - 什么是对象发送者和 EventArgs e?

我不了解应用程序域

react 式扩展使用的好例子

是否有 Linq 方法可以将单个项目添加到 IEnumerable

在生产环境中部署调试符号(pdb 文件)有什么风险?

如何正确和完全关闭/重置 TcpClient 连接?

从 'System.Int32' 到 'System.Nullable`1[[System.Int32, mscorlib]] 的无效转换

为什么要使用 C# 类 System.Random 而不是 System.Security.Cryptography.RandomNumberGenerator?

如何为我的 C# 应用程序创建产品密钥?

在 WPF 中设置 Tab 键顺序