我总是在我的 C # 代码中引用 DLL,但是它们仍然有些神秘,我想澄清一下。这是一种关于 DLL 的问题的大脑转储。
我知道 DLL 是一个动态链接的库,这意味着其他程序可以在运行时访问这个库来获得“功能”。然而,考虑下面的 ASP.NET 项目,它包含 Web.dll
和 Business.dll
(Web.dll
是前端功能,它在类型和方法中引用 Business.dll
)。
Web.dll
在什么时候动态链接到 Business.dll
?在使用 Word (等等)时,你注意到 Windows 硬盘对于看似小的任务有很多不同的处理方式,我认为 Word 正在从其他 DLL 中动态链接功能?
1a.此外,什么加载和链接 DLL-操作系统或某些运行时框架,如。NET 框架?
1B.什么是“连接”的过程?是否进行了兼容性检查?进入同一段记忆?链接到底意味着什么?
什么实际执行 DLL 中的代码?是由处理器执行,还是在处理器理解 DLL 中的代码之前,还有另一个翻译或编译阶段?
2a.在 C # 中内置 DLL 的情况下。NET,什么是运行这个:。NET 框架还是直接操作系统?
来自 Linux 的 DLL 是否可以在 Windows 系统上工作(如果存在的话) ,或者它们是特定于操作系统的?
DLL 是特定于特定框架的吗?可以使用 C # 构建 DLL 吗。NET 被一个 DLL 所使用,例如,Borland C + + ?
4a.如果4的答案是“否”,那么 DLL 的意义何在?为什么不同的框架使用自己的链接文件格式?例如:。内建的 exe。NET 知道文件类型为。是它可以链接到它的代码的东西。
回到 Web.dll
/Business.dll
例子-为了获得客户的类型,我需要从 Web.dll
引用 Business.dll
。这肯定意味着 Business.dll
包含某种关于客户类实际上是什么的规范。如果我已经编译了我的 Business.dll
文件,比如说,Delphi: C # 能够理解它并且能够创建一个客户类,或者有一些类型的头信息或者说“嘿,对不起,你只能从另一个 Delphi DLL 使用我”?
5a.方法也是如此; 我是否可以在 DLL 中编写 CreateInvoice()
方法,然后在 C + + 中编译它,然后从 C # 访问并运行它?是什么阻止或允许我这么做?
关于 DLL 劫持问题,当然替代(坏) DLL 必须包含被劫持的方法签名和类型。如果您能找出原始 DLL 中有哪些方法可用,我想这并不难做到。
6a.在我的 C # 程序中,是什么在决定我是否可以访问另一个 DLL?如果我劫持的 DLL 包含与原始 DLL 完全相同的方法和类型,但它是用另一种语言编译的,它会工作吗?
什么是 DLL 导入和 DLL 注册?