Если вы используете неуправляемые ресурсы, вы должны освободить их или, если они уже освобождены, не пытайтесь освободить их снова. Некоторый код очень помог бы здесь, но похоже, что вы нажимаете нулевой указатель в своем методе finalize или что-то в этом роде, а затем сборщик мусора пытается избавиться от объекта с указателем на нулевой указатель.
Для пример
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("user32.dll", SetLastError=true)]
static extern IntPtr GetDC(IntPtr hWnd);
public class ExampleClass
{
private int _hwnd;
private IntPtr _dc;
public ExampleClass(int hwnd) : IDispose
{
this._dc = GetDC(hWnd);
this._hwnd = hwnd;
Console.WriteLine("Got pointer to device context of window with hWnd" + hwnd.toString());
}
public void Dispose(){
ReleaseDc(this._hwnd, this._ds);
}
~ExampleClass()
{
Console.WriteLine("Finalizing object");
ReleaseDc(this._hwnd, this._ds); //Bang, the handle was already released in the dispose method....
}
}