фатальная ошибка при сборе g c из неизвестного потока - PullRequest
0 голосов
/ 10 февраля 2020

Я использую Microsoft-IIS / 10.0, As pNetMvc -Версия: 5.2, As pNet -Версия: 4.0.30319, для запуска моего приложения. проблема произошла, когда я вызываю функцию из неуправляемой библиотеки DLL (C код). Все работает хорошо для 3 или максимум 5 забегов. После этого происходит «фатальная ошибка» и приложение останавливается. Любая помощь будет приветствоваться. Спасибо и всего наилучшего

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020
Here is my code:

public class FmuInstance : IDisposable
{
    private readonly string fileName;
    private IntPtr wrapper;

    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string lpFileName);

    [DllImport("kernel32.dll")]
    public static extern IntPtr FreeLibrary(IntPtr library);


    public void LoadDLL(string path)
    {
        wrapper = LoadLibrary(path);
        if (wrapper == IntPtr.Zero)
            throw new DllNotFoundException("----");
        FreeLibrary(wrapper);
    }

    public void FreeDLL()
    {
        FreeLibrary(wrapper);
    }

    public void FreeInstance()
    {
        if (wrapper != IntPtr.Zero)
            FreeDLL();
        wrapper = IntPtr.Zero;
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                // Free managed resources
            }
            // Free unmanaged resources
            FreeInstance();
            // Avoid disposing multiple times
            disposedValue = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}
0 голосов
/ 10 февраля 2020

Если вы используете неуправляемые ресурсы, вы должны освободить их или, если они уже освобождены, не пытайтесь освободить их снова. Некоторый код очень помог бы здесь, но похоже, что вы нажимаете нулевой указатель в своем методе 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....
   }
}
...