为什么这段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调用类型安全?

为什么这段c#代码不是类型安全的,为什么这段代码是类型安全的

改编我的评论作为答案…

我不知道是什么使修改后的版本类型安全,但它是一个更安全(更不容易出错)的调用。

可以用nulldwCallbackInstanceMidiOpenFlags = MidiOpenFlags.CALLBACK_FUNCTION来调用dll函数midiOutOpen参数。如果dll函数不检查null,那么它将引起一些干扰。

所采用的函数midiOutOpen参数是推导出来的,所以没有危险。

我不知道SetLastError = true是什么,但我认为包装器可能已经检查了LastError并采取了适当的行动(抛出异常?)