c# 如何释放非托管外部dll资源

kujingzhong 2009-03-12 10:00:48
我的程序中使用计时器不停的调用外部dll文件进行计算,有的时候运行时间比较长后,cpu负荷会升高,我怀疑是外部非托管资源没有释放,请问如何释放?
...全文
346 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyilin888 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 csppqiuyx 的回复:]
GC.SuppressFinalize(this);
微软不建议用户直接调用GC.*方法。
也不要用析构函数了,直接dispose()方法应该可行了吧
[/Quote]
关键是在dispose中怎么写释放代码,尤其是DLL
isinosun 2009-03-13
  • 打赏
  • 举报
回复
//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);
}
}
常熟老九 2009-03-13
  • 打赏
  • 举报
回复
GC.SuppressFinalize(this);
微软不建议用户直接调用GC.*方法。
也不要用析构函数了,直接dispose()方法应该可行了吧
kujingzhong 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 minyskirt 的回复:]
1、定义一个实现了IDispose的类
class A:IDisposable
{
#region IDisposable 成员

void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

#endregion

protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// 做一些释放…
[/Quote]

请问我的程序是在计时器中不停的调用,是不是每一次调用完都要释放。
minyskirt 2009-03-13
  • 打赏
  • 举报
回复
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();
}
EveryCase 2009-03-13
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧