1. 使用 Visual Studio 2005 和 Visual C++ 创建简单的 C DLL 有什么区别?我看到在 studio 下创建它时还创建了一个清单,并且由于使用并排文件夹(当从 C# 应用程序调用该 dll 时),我在另一台计算机上部署时遇到了一些问题”
  2. 调用dll的机制是如何工作的?

谢谢

有帮助吗?

解决方案

既然 nobugz 已经涵盖了你的第一个问题,那么让我详细阐述第二个问题。这并不难理解。

当您在 Windows 中编译 DLL 时,链接器会创建一个导出地址表 (EAT),其中列出了所有导出函数(DLL 提供的函数)以及指向它们在 DLL 本身中实现的位置的指针。

当编译链接到 DLL 的应用程序时,链接器会创建一个导入地址表 (IAT),其中列出在其他 DLL 中实现的所有函数以及实现这些函数的 DLL 的名称。它通过添加到项目中的 .lib 文件来了解 DLL 中是否存在某个函数。这告诉链接器某个函数是在 DLL 中实现的。

然后在运行时,在加载应用程序时,Windows 加载程序会检查 IAT 以了解需要加载哪些 DLL,找到它们,并更新应用程序 IAT(在内存中)以指向加载的 DLL 中的导出函数。

这就是它的工作原理,希望我没有包含任何严重的错误。当然,P/Invoke 是在此之上的另一层。

如果您想了解有关 DLL 如何工作的更多信息,请访问 MSDN 文档 如果您想要足够多的细节让您头晕,请阅读这些 Inside Windows 文章 第1部分第2部分

其他提示

是的,如果您使用 /MD(默认设置)编译 DLL 的代码,那么您必须 部署 CRT 库 到目标机器。如果这只是一个独立的 DLL,没有任何其他依赖项,那么使用静态 CRT 选项进行编译是有意义的,这样您就不必部署这些库。右键单击 DLL 项目、“属性”、“C/C++”、“代码生成”、“运行时库 = /MTd”以进行调试配置。重复发布配置,现在使用 /MT。

Google“P/Invoke 封送处理”以了解有关如何从托管程序调用非托管代码的更多信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top