在visual studio 2005和visual C ++ 6.0中编译

时间:2010-01-21 16:37:19

标签: c visual-c++ visual-studio-2005 vc6

  1. 在使用visual studio 2005和visual C ++之间创建简单的C DLL有什么区别。我看到在工作室下创建它时也创建了一个清单,因为使用并排文件夹(当调用该dll形成C#应用程序时)我在另一台机器上部署时遇到了一些问题“
  2. 调用dll的机制如何工作?
  3. 由于

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

由于nobugz已经涵盖了你的第一个问题,让我扩展第二个问题。理解起来并不是非常困难。

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

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

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

这是基础知识如何运作,希望我没有包含任何严重不准确之处。当然,P / Invoke是另一层。

如果您想了解有关DLL如何工作的更多信息,请始终使用MSDN documentation,如果您需要足够的详细信息,请阅读这些内部Windows文章Part 1Part 2