【问题标题】:Using Windows API functions in .NET在 .NET 中使用 Windows API 函数
【发布时间】:2013-02-28 18:54:19
【问题描述】:

我前段时间在这里问了一个问题:COM vs non-COM DLL 关于从 .NET 调用经典 C++ 程序。

答案(来自 Hans Passant)是用 Visual C++ 编写一个包装类,这在我的项目中效果很好(我确实从另一位在 C++ 方面更有商业经验的开发人员那里得到了一些帮助)。

我的问题是:是否为 WINAPI 中的某些函数创建了包装类。例如,下面的代码在没有包装类的情况下工作:

Imports System.Runtime.InteropServices
Imports System.Text

Public Class Form1

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)> _
    Public Shared Function MessageBox(ByVal hwnd As IntPtr, <MarshalAs(UnmanagedType.LPStr)> ByVal lpString As String, <MarshalAs(UnmanagedType.LPStr)> ByVal lpString2 As String, ByVal cch As Integer) As Integer
    End Function

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        MessageBox(0, "HelloWorld", "HelloWorld", 0)
    End Sub
End Class

【问题讨论】:

标签: c++ vb.net c++-cli


【解决方案1】:

围绕 WINAPI 调用的现有包装类称为 System.Windows 命名空间。 ;-)

【讨论】:

  • 谢谢。 +1 供 MSDN 参考。
【解决方案2】:

汉斯对你其他问题的评论说:

您不能直接使用在 .NET 程序中导出类的 C++ DLL。需要使用 C++/CLI 语言编写的包装器。

正如他所说,在这种情况下,为什么需要包装器是因为 .NET 无法使用由 C++ 导出的 。然而,在这种情况下,MessageBox 函数只是一个 函数,它由从 C++ 编译的 DLL 导出,而不是 。正如您所演示的,VB.NET 可以很容易地用于调用 API 函数。问题不在于调用 API 函数。问题在于使用 C++ 类。

正如其他人所说,在这种情况下,您只想使用托管的MessageBox.Show

【讨论】:

  • 感谢 +1 澄清这一点。这就是您只能使用 DLLIMPORT 引用共享成员的原因吗?我会一直使用 MessageBox.Show。我问这个问题的原因是为了学习。
  • 我完全不熟悉 C++ 中的 Windows 编程,但据我所知,是的。您当然不能导入类的实例方法,因为这样做需要先实例化该类型的对象。
  • C++ 是一种面向对象的编程语言。为什么不创建包装器就不能创建类的实例?
  • .NET 只能从其他 .NET DLL 和 COM DLL(间接通过互操作 DLL)导入类。问题不在于面向对象。问题在于暴露类的技术。
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2019-04-30
相关资源
最近更新 更多