diff --git a/SharpPhysFS/Interop.cs b/SharpPhysFS/Interop.cs index b3d1b48..c531b7e 100644 --- a/SharpPhysFS/Interop.cs +++ b/SharpPhysFS/Interop.cs @@ -99,6 +99,7 @@ namespace SharpPhysFS } class Interop + : IDisposable { InvalidOperationException initException = new InvalidOperationException("Callbacks not initialized yet"); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] @@ -201,6 +202,11 @@ namespace SharpPhysFS : this($"{libname}.dll", $"{libname}.dylib", $"{libname}.so") { } + Func loadLibrary; + Func loadSymbol; + Func freeLibrary; + IntPtr library; + public Interop(string winlib, string maclib, string unixlib) { /* This method is used to dynamically load the physfs @@ -212,28 +218,27 @@ namespace SharpPhysFS * pointers from the loaded library */ - Func loadLibrary; - Func loadSymbol; string libraryName; - IntPtr library; - if (Environment.OSVersion.Platform == PlatformID.Win32NT) { loadLibrary = DynamicLoader.LoadLibrary; loadSymbol = DynamicLoader.GetProcAddress; + freeLibrary = DynamicLoader.FreeLibrary; libraryName = winlib; } else if(Environment.OSVersion.Platform == PlatformID.MacOSX) { loadLibrary = n => DynamicLoader.osx_dlopen(n, 1); loadSymbol = DynamicLoader.osx_dlsym; + freeLibrary = DynamicLoader.osx_dlclose; libraryName = maclib; } else { loadLibrary = n => DynamicLoader.unix_dlopen(n, 1); loadSymbol = DynamicLoader.unix_dlsym; + freeLibrary = DynamicLoader.unix_dlclose; libraryName = unixlib; } @@ -253,5 +258,29 @@ namespace SharpPhysFS field.SetValue(this, del); } } + + #region IDisposable Support + private bool disposedValue = false; // To detect redundant calls + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + /*if (disposing) + { + // TODO: dispose managed state (managed objects). + }*/ + + freeLibrary(library); + + disposedValue = true; + } + } + + public void Dispose() + { + Dispose(true); + } + #endregion } } diff --git a/SharpPhysFS/PhysFS.cs b/SharpPhysFS/PhysFS.cs index 0cb760c..a9c5e72 100644 --- a/SharpPhysFS/PhysFS.cs +++ b/SharpPhysFS/PhysFS.cs @@ -684,7 +684,7 @@ namespace SharpPhysFS /// if you don't need /// to pass custom data to the callback. /// - /// Type of data passed to callbakc + /// Type of data passed to callback /// Directory, in platform-independent notation, to enumerate. /// Callback function to notify about search path elements. /// Application-defined data passed to callback. Can be null. @@ -725,9 +725,25 @@ namespace SharpPhysFS return new PhysFSStream(this, handle, false); } + bool disposed = false; + + protected virtual void Dispose(bool disposing) + { + if (!disposed) + { + if (disposing) + { + Deinit(); + interop.Dispose(); + } + + disposed = true; + } + } + public void Dispose() { - Deinit(); + Dispose(true); } } }