.Net读取Native动态链接库的一个封装类

在工作中需要用C#调用C++写的Native DLL,传统的方式是LoadLibrary,然后GetProcAddress,最后FreeLibrary,用起来很繁琐,就自己写了一个封装类,省去了调用Win32Api的麻烦。

封装类代码如下:

public class NativeLibraryLoader : IDisposable
{
    public enum ErrorCode { UnKnown = -1, Success = 0, LoadLibError = 1, GetProcAddressError = 2 };

    private IntPtr hLib = IntPtr.Zero;
    private ErrorCode errCode = ErrorCode.UnKnown;

    #region import dll function

    [DllImport("kernel32.dll")]
    private extern static IntPtr LoadLibrary(string path);

    [DllImport("kernel32.dll")]
    private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);

    [DllImport("kernel32.dll")]
    private extern static bool FreeLibrary(IntPtr lib);

    #endregion import dll function

    public NativeLibraryLoader(string libPath)
    {
        hLib = LoadLibrary(libPath);
        if (hLib == IntPtr.Zero)
        {
            errCode = ErrorCode.LoadLibError;
        }
        else
        {
            errCode = ErrorCode.Success;
        }
    }

    public Delegate GetDelegateFunc<T>(string funcName)
    {
        if (hLib == IntPtr.Zero)
        {
            errCode = ErrorCode.LoadLibError;
            return null;
        }

        IntPtr procAddr = GetProcAddress(hLib, funcName);
        if (procAddr == IntPtr.Zero)
        {
            errCode = ErrorCode.GetProcAddressError;
            return null;
        }

        return Marshal.GetDelegateForFunctionPointer(procAddr, typeof(T));
    }

    public ErrorCode GetLastError()
    {
        return errCode;
    }

    public void Dispose()
    {
        if (hLib != IntPtr.Zero && FreeLibrary(hLib))
        {
            hLib = IntPtr.Zero;
        }
    }
}

调用实例:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int TestFunc();

using (NativeLibraryLoader loader = new NativeLibraryLoader(@"test.dll"))
{
    if (loader.GetLastError() != NativeLibraryLoader.ErrorCode.Success)
    {
        return false;
    }

    TestFunc func = (TestFunc)loader.GetDelegateFunc<TestFunc>("TestFuncMethodName");
    if (loader.GetLastError() != NativeLibraryLoader.ErrorCode.Success || func == null)
    {
        return false;
    }

    func();
}


你可能感兴趣的:(.net,C#,dll,native)