如何手动处理非托管资源?

时间:2011-01-18 08:28:22

标签: c# unmanagedresources

我正在使用一些非托管代码,例如 -

 [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
    //Creating a function that uses the API function...
    public static bool IsConnectedToInternet() {
        int Desc;
        return InternetGetConnectedState(out Desc, 0);
    }

关于在调用Dispose时如何处理/清理此外部静态对象的任何建议?

3 个答案:

答案 0 :(得分:5)

你认为'extern静态对象'根本不是一个对象,它只是编译器/运行时关于如何在DLL中查找函数的一组指令。

正如桑德所说,没有什么可以清理的。

答案 1 :(得分:3)

此处没有任何非托管资源句柄。没有什么可以清理的。

答案 2 :(得分:2)

这取决于你是否可以获得一个指针,作为一个例子

[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(string principal, string authority, string password, LogonSessionType logonType, LogonProvider logonProvider, out IntPtr token);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle);

public void DoSomething() {
    IntPtr token = IntPtr.Zero;
    WindowsImpersonationContext user = null;
    try {
        bool loggedin = LogonUser((string)parameters[1], (string)parameters[2], (string)parameters[3], LogonSessionType.Interactive, LogonProvider.Default, out token);
        if (loggedin) {
            WindowsIdentity id = new WindowsIdentity(token);
            user = id.Impersonate();
        }
    } catch (Exception ex) {

    } finally {
        if (user != null) {
            user.Undo();
        }
        if (token != IntPtr.Zero) {
            CloseHandle(token);
        }
    }
}