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