由于
答案 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 1和Part 2