Vb.net Declare和System.Runtime.InteropServices.DllImportAttribute之间有什么区别?

Vb.net Declare和System.Runtime.InteropServices.DllImportAttribute之间有什么区别?,vb.net,declare,compiler-services,Vb.net,Declare,Compiler Services,我正在使用VB.NET并从系统DLL中获取一个图标。因此,我使用。正如在评论中提到的,我再次使用它来释放资源 到目前为止,我用的是电话线 私有声明自动函数destroicon Lib user32.dll ByVal hIcon作为IntPtr作为布尔值 声明该方法 从Icon.FromHandle的示例中,我看到它们使用 _ 专用共享功能图标 ByVal hIcon作为IntPtr作为布尔值 端函数 有什么区别 我尤其感到困惑的是,DllImportAttribute似乎不像Declare那样

我正在使用VB.NET并从系统DLL中获取一个图标。因此,我使用。正如在评论中提到的,我再次使用它来释放资源

到目前为止,我用的是电话线

私有声明自动函数destroicon Lib user32.dll ByVal hIcon作为IntPtr作为布尔值 声明该方法

从Icon.FromHandle的示例中,我看到它们使用

_ 专用共享功能图标 ByVal hIcon作为IntPtr作为布尔值 端函数 有什么区别

我尤其感到困惑的是,DllImportAttribute似乎不像Declare那样容易工作。我做了以下测试:

我使用从ini文件中获取字符串

私有声明自动函数GetPrivateProfileString库内核32 ByVal lpApplicationName作为字符串, ByVal lpKeyName作为字符串, ByVal默认为字符串, ByVal lpReturnedString作为字符串, ByVal nSize为整数, ByVal lpFileName作为字符串作为整数 作品;它将条目写入lpReturnedString缓冲区并返回41

_ 私有共享函数GetPrivateProfileString ByVal lpApplicationName作为字符串, ByVal lpKeyName作为字符串, ByVal默认为字符串, ByVal lpReturnedString作为字符串, ByVal nSize为整数, ByVal lpFileName作为字符串作为整数 端函数
保持lpReturnedString不变,但返回正确的字符串长度41。

Declare关键字是早期VB版本的遗留关键字。对简单的winapi函数(如DestroyIcon)执行完全相同的操作,但DllImport属性具有更多功能。请注意,您对GetPrivateProfileString的声明是危险的错误,字符串是不可变的,pinvoke.net网站可以为您提供一个更好的声明。您为什么不直接使用并让框架来完成工作,而不是与所有这些API混在一起?@puropoix该怎么说?这里没有关于rate或accept的答案。@HansPassant我知道字符串是不可变的,实际上我不知道declare版本为什么工作。为便于将来参考,可以找到中的声明。它使用StringBuilder,我使用缓冲区大小的容量初始化它。通过该修改,DllImportAttribute也可以工作。