为什么这段c#代码不是类型安全的,为什么这段代码是类型安全的
本文关键字:为什么 类型安全 代码 段代码 | 更新日期: 2023-09-27 18:10:24
这来自midi-dot-net http://code.google.com/p/midi-dot-net/库:
static class Win32API
{ ...
#region Non-Typesafe Bindings
// The bindings in this section are not typesafe, so we make them private
// and provide typesafe variants
[DllImport("winmm.dll", SetLastError = true)]
private static extern MMRESULT midiOutOpen(out HMIDIOUT lphmo,
UIntPtr uDeviceID, MidiOutProc dwCallback, UIntPtr dwCallbackInstance,
MidiOpenFlags dwFlags);
...
/// <summary>
/// Opens a MIDI output device.
/// </summary>
/// NOTE: This is adapted from the original Win32 function in order
/// to make it typesafe.
///
/// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711632(VS.85).aspx
public static MMRESULT midiOutOpen(out HMIDIOUT lphmo,
UIntPtr uDeviceID, MidiOutProc dwCallback, UIntPtr dwCallbackInstance)
{
return midiOutOpen(out lphmo, uDeviceID, dwCallback, dwCallbackInstance,
dwCallback == null ? MidiOpenFlags.CALLBACK_NULL :
MidiOpenFlags.CALLBACK_FUNCTION);
}
最后一个函数如何使win32调用类型安全?
改编我的评论作为答案…
我不知道是什么使修改后的版本类型安全,但它是一个更安全(更不容易出错)的调用。
可以用null
、dwCallbackInstance
、MidiOpenFlags = MidiOpenFlags.CALLBACK_FUNCTION
来调用dll函数midiOutOpen
参数。如果dll函数不检查null,那么它将引起一些干扰。
所采用的函数midiOutOpen
参数是推导出来的,所以没有危险。
我不知道SetLastError = true
是什么,但我认为包装器可能已经检查了LastError
并采取了适当的行动(抛出异常?)