我的程序中使用计时器不停的调用外部dll文件进行计算,有的时候运行时间比较长后,cpu负荷会升高,我怀疑是外部非托管资源没有释放,请问如何释放?

解决方案 »

  1.   

    1、定义一个实现了IDispose的类
    class A:IDisposable
        {
            #region IDisposable 成员        void IDisposable.Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }        #endregion        protected virtual void Dispose(bool disposing)
            {
                if (disposing)
                {
                    // 做一些释放资源的操作,比如关闭文件连接,或者非托管资源的连接
                }
            }
            // 这种方式为可终结类型释放资源
            ~A()
            {
                Dispose(false);
            }
        }2、调用A的示例:
     A a = new A();
                if (a is IDisposable)
                {
                    ((IDisposable)a).Dispose();
                }
      

  2.   

    GC.SuppressFinalize(this); 
    微软不建议用户直接调用GC.*方法。
    也不要用析构函数了,直接dispose()方法应该可行了吧
      

  3.   

    //Dll操作类-将要执行的函数转换为委托
    /*
     * //下面代码进行调用
     * public delegate int Compile(String command, StringBuilder inf);//编译
     * My_DllInvoke dll = new My_DllInvoke(Server.MapPath(@"~/Bin/dll.dll"));
     * Compile compile = (Compile)dll.Invoke("Compile", typeof(Compile));
     * StringBuilder inf;
     * compile(@“gcc a.c -o a.exe“,inf); //这里就是调用我的DLL里定义的Compile函数
     */
    public class My_DllInvoke
    {
        [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);
        private IntPtr hLib;
        public My_DllInvoke(String DLLPath)
        {
            hLib = LoadLibrary(DLLPath);
        }
        ~My_DllInvoke()
        {
            FreeLibrary(hLib);            
        }
        //将要执行的函数转换为委托
        public Delegate Invoke(String APIName,Type t)  
        {
            IntPtr api = GetProcAddress(hLib, APIName);
            return (Delegate)Marshal.GetDelegateForFunctionPointer(api,t);
        }
    }
      

  4.   

    关键是在dispose中怎么写释放代码,尤其是DLL