我目前正在尝试学习如何在C#和C ++中编写和使用Windows的.dll文件。我想,一旦我理解了其中一个语言,我就能很容易地找出另一个语言。我今天搜索了超过5个小时,但是找不到工作的.dll指南却没有运气。它们要么已经过时,要么拒绝使用我的编译器,或者只是彻头彻尾的垃圾。有人知道工作的好指南吗?我正在使用Dev C ++和VC ++ 2010.感谢您的帮助! :)
答案 0 :(得分:5)
C#和C ++中的DLL有些不同,特别是在它们的使用方式上。 C#使用汇编,包含各种元数据,并隐藏大部分细节。 C ++没有,你必须告诉它导出的内容和方式。
制作DLL通常包括编写代码,然后对于您想要使用的每个类或函数(从DLL外部),添加以下内容:
int __declspec(dllexport) function(int param);
class __declspec(dllexport) object;
这将“导出”符号,使它们从DLL外部可见。你只需要为那些将在外部使用的,对于类,只在类(而不是每个方法)上执行此操作。
使用DLL时,您需要包含具有所有功能但带有__declspec(dllimport)
注释的标头。这将告诉您的代码这些是从外部DLL使用的。您需要将lib(在编译DLL时创建)作为输入文件提供给链接器,并且所有内容都应该排成一行。
处理这个问题的一个简单方法是:
#ifndef IMPORT_MYLIB
# define MYLIB_API __declspec(dllexport)
#else
# define MYLIB_API __declspec(dllimport)
#endif
int MYLIB_API function();
在其他应用中使用DLL时,只需#define IMPORT_MYLIB
即可正确设置标题。
对于C#,您只需创建一个包含公共类的库,然后将其添加为对另一个项目的引用。然后,您可以使用它中的类,这两个文件将自动链接在一起(更简单,但并不总是像C ++的方法一样干净)。
请注意,DLL是特定于Microsoft的,稍后可能会有一些小细节(如何搜索导入等)。
答案 1 :(得分:2)
C#中的DLL很容易。
Peachykeen列出了从C ++ DLL导出类和函数的最基本方法。我建议有一种更先进的技术。而不是导出所需的每个类,而是从接口(具有至少一个纯虚方法的类)派生dll中的所有类。然后导出一个返回指向这些接口的指针的工厂函数。这减少了主可执行文件和dll之间的耦合,因为您只需要共享接口,而不是任何实现细节。
代码项目有一篇关于这种技术的好文章。
http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
上述方法的一个很好的好处是它大大减少了编译时间。您可以完全重新实现DLL,而无需重新编译主应用程序。
答案 2 :(得分:0)
在visual studio中,它们现在被称为“程序集”而不是DLL。术语的变化令人困惑。创建DLL只需创建正确类型的项目并添加代码即可。从不同的语言或编译器使用DLL可能会很棘手。
您是否尝试过this教程?