问题
I asked a question some time ago here: COM vs non-COM DLL about calling a classic C++ program from .NET.
The answer (from Hans Passant) was to write a wrapper class in Visual C++, which worked out well in my project (I did get some help with this from another developer who is more commerically experienced with C++).
My question is: is there wrapper classes created for some of the functions in the WINAPI. For example, the code below works without a wrapper class:
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
回答1:
Hans' comment on your other question said:
You cannot directly use a C++ DLL that exports classes in a .NET program. A wrapper written in the C++/CLI language is required.
As he said, the reason, in that situation, why a wrapper was needed is because .NET cannot use a class that is exported by C++. In this case, however, the MessageBox
function is simply a function that is exported by a DLL that was compiled from C++, not a class. VB.NET can very easily be used to invoke API functions, as you have demonstrated. The problem is not with calling API functions. The problem is with using C++ classes.
As others have said, though, in this case, you just want to use the managed MessageBox.Show
.
回答2:
The existing wrapper classes around WINAPI calls are called the System.Windows namespace. ;-)
来源:https://stackoverflow.com/questions/15143425/using-windows-api-functions-in-net