Skip to content

Commit

Permalink
Prepare v2.2.0 release
Browse files Browse the repository at this point in the history
  • Loading branch information
ied206 committed Aug 7, 2023
1 parent 29bf4e3 commit d097eba
Show file tree
Hide file tree
Showing 11 changed files with 178 additions and 46 deletions.
31 changes: 24 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,26 @@

## v2.x

### v2.2.0

Released on 2023-08-08.

- Allow passing a custom object when loading a native library.
- Add `LoadManagerBase.GlobalInit()` overloadings with custom object parameter.
- Add `DynLoaderBase.LoadLibrary()` overloadings with custom object parameter.
- Add virtual method `DynLoaderBase.HandleLoadData()`.
- Add helper method `DynLoaderBase.HasFuncSymbol()`.

### v2.1.1

Released on 2022-02-15.

- Official support for ARM64 macOS.
- Unify .NET Framework 4.5.1 codebase and .NET Standard 2.0 codebase.

### v2.1.0

Release in 2021.04.05.
Released on 2021-04-05.

- Avoid calling virtual methods from constructors in `DynLoaderBase`.
- Users must call `DynLoaderBase.LoadLibrary` after creating an instance.
Expand All @@ -14,7 +31,7 @@ Release in 2021.04.05.

### v2.0.0

Released in 2020.04.24.
Released on 2020-04-24.

- Use `NativeLoader` on .NET Core 3.x build.
- `DynLoaderBase` now throws [DllNotFoundException](https://docs.microsoft.com/en-US/dotnet/api/system.dllnotfoundexception) and [EntryPointNotFoundException](https://docs.microsoft.com/en-US/dotnet/api/system.entrypointnotfoundexception) instead of [ArgumentException](https://docs.microsoft.com/en-US/dotnet/api/system.argumentexception) and [InvalidOperationException](https://docs.microsoft.com/en-us/dotnet/api/system.invalidoperationexception).
Expand All @@ -30,31 +47,31 @@ Released in 2020.04.24.

### v1.3.0

Released in 2020.02.29.
Released on 2020-02-29.

- Add `size_t` helper methods.
- Rename AutoStringToCoTaskMem() into StringToCoTaskMemAuto().

### v1.2.1

Released in 2019.10.31.
Released on 2019-10-31.

- Address `libdl.so` naming issue for CentOS ([#1](https://github.com/ied206/Joveler.DynLoader/issues/1))

### v1.2.0

Released in 2019.10.16.
Released on 2019-10-16.

- Add platform convention helper properties and methods

### v1.1.0

Released in 2019.10.15.
Released on 2019-10-15.

- Add `LoadManagerBase` abstract class

### v1.0.0

Released in 2019.10.15.
Released on 2019-10-15.

- The initial release of the cross-platform native dynamic library loader for .NET.
5 changes: 3 additions & 2 deletions Joveler.DynLoader.Tests/SimpleZLib.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ protected override string DefaultLibFileName

public bool HasUnknownSymbol { get; private set; } = true;
public bool HasCrc32Symbol { get; private set; } = false;
public IntPtr UnknownRawPtr { get; private set; } = IntPtr.Zero;
public IntPtr DeflateRawPtr { get; private set; } = IntPtr.Zero;
#endregion

Expand All @@ -48,8 +49,8 @@ protected override string DefaultLibFileName
internal Cdecl _cdecl = new Cdecl();
#endregion

#region ParseCustomData
protected override void ParseLoadData(object data)
#region HandleCustomData
protected override void HandleLoadData(object data)
{
if (!(data is SimpleZLibLoadData loadData))
return;
Expand Down
3 changes: 3 additions & 0 deletions Joveler.DynLoader.Tests/SimpleZLibTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,12 @@ private void ManagerTemplate(string libPath, bool isWindowsStdcall)
Assert.IsTrue(dupInitGuard);

Console.WriteLine(manager.Lib.ZLibVersion());
Console.WriteLine($"UnknownRawPtr = 0x{manager.Lib.UnknownRawPtr:X8}");
Console.WriteLine($"DeflateRawPtr = 0x{manager.Lib.DeflateRawPtr:X8}");

Assert.IsFalse(manager.Lib.HasUnknownSymbol);
Assert.IsTrue(manager.Lib.HasCrc32Symbol);
Assert.AreEqual(IntPtr.Zero, manager.Lib.UnknownRawPtr);
Assert.AreNotEqual(IntPtr.Zero, manager.Lib.DeflateRawPtr);

bool dupCleanGuard = false;
Expand Down
50 changes: 30 additions & 20 deletions Joveler.DynLoader/DynLoaderBase.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (C) 2019-2021 Hajin Jang
Copyright (C) 2019-2023 Hajin Jang
Licensed under MIT License.
MIT License
Expand Down Expand Up @@ -146,20 +146,20 @@ public void LoadLibrary(string libPath)
}

/// <summary>
/// Load a native dynamic library from a path of `DefaultLibFileName`.
/// Load a native dynamic library from a path of `DefaultLibFileName`, with custom object.
/// </summary>
/// <param name="data">Custom object to be passed to <see cref="LoadManagerBase{T}.GlobalInit()"/>.</param>
public void LoadLibrary(object data)
/// <param name="loadData">Custom object has been passed to <see cref="LoadManagerBase{T}.GlobalInit()"/>.</param>
public void LoadLibrary(object loadData)
{
LoadLibrary(null, data);
LoadLibrary(null, loadData);
}

/// <summary>
/// Load a native dynamic library from a given path.
/// Load a native dynamic library from a given path, with custom object.
/// </summary>
/// <param name="libPath">A native library file to load.</param>
/// <param name="data">Custom object to be passed to <see cref="LoadManagerBase{T}.GlobalInit()"/>.</param>
public void LoadLibrary(string libPath, object data)
/// <param name="loadData">Custom object has been passed to <see cref="LoadManagerBase{T}.GlobalInit()"/>.</param>
public void LoadLibrary(string libPath, object loadData)
{
// Should DynLoaderBase use default library filename?
if (libPath == null)
Expand All @@ -172,7 +172,7 @@ public void LoadLibrary(string libPath, object data)
LibPath = libPath;

// Parse custom load data
ParseLoadData(data);
HandleLoadData(loadData);

// Use .NET Core's NativeLibrary when available
#if NETCOREAPP
Expand Down Expand Up @@ -269,11 +269,11 @@ public void LoadLibrary(string libPath, object data)

#region (protected) GetFuncPtr, GetRawFuncPtr, HasFuncSymbol
/// <summary>
/// Get a delegate of a native function from a library.
/// The method will use name of the given delegate T as function symbol.
/// Get a delegate of a native function from the library.
/// The method will use name of the given delegate T as a function symbol.
/// </summary>
/// <typeparam name="T">Delegate type of a native function.</typeparam>
/// <returns>Delegate instance of a native function.</returns>
/// <typeparam name="T">Delegate type of the native function.</typeparam>
/// <returns>Delegate instance of the native function.</returns>
/// <exception cref="EntryPointNotFoundException">Throwen if the given function symbol was not found.</exception>
protected T GetFuncPtr<T>() where T : Delegate
{
Expand All @@ -282,11 +282,11 @@ protected T GetFuncPtr<T>() where T : Delegate
}

/// <summary>
/// Get a delegate of a native function from a library.
/// Get a delegate of a native function from the library.
/// </summary>
/// <typeparam name="T">Delegate type of a native function.</typeparam>
/// <typeparam name="T">Delegate type of the native function.</typeparam>
/// <param name="funcSymbol">Name of the exported function symbol.</param>
/// <returns>Delegate instance of a native function.</returns>
/// <returns>Delegate instance of the native function.</returns>
/// <exception cref="EntryPointNotFoundException">Throwen if the given function symbol was not found.</exception>
protected T GetFuncPtr<T>(string funcSymbol) where T : Delegate
{
Expand Down Expand Up @@ -342,6 +342,11 @@ protected T GetFuncPtr<T>(string funcSymbol) where T : Delegate
return Marshal.GetDelegateForFunctionPointer<T>(funcPtr);
}

/// <summary>
/// Get a raw pointer of a native function from the library.
/// </summary>
/// <param name="funcSymbol">Name of the exported function symbol.</param>
/// <returns>Raw pointer address of the native function. Returns IntPtr.Zero if the symbol was not found.</returns>
protected IntPtr GetRawFuncPtr(string funcSymbol)
{
IntPtr funcPtr = IntPtr.Zero;
Expand Down Expand Up @@ -371,6 +376,11 @@ protected IntPtr GetRawFuncPtr(string funcSymbol)
return funcPtr;
}

/// <summary>
/// Check if the library has a native function symbol.
/// </summary>
/// <param name="funcSymbol">Name of the exported function symbol.</param>
/// <returns>Returns true if the address of the exported symbol was found.</returns>
protected bool HasFuncSymbol(string funcSymbol)
{
return GetRawFuncPtr(funcSymbol) != IntPtr.Zero;
Expand All @@ -388,12 +398,12 @@ protected bool HasFuncSymbol(string funcSymbol)
protected abstract string DefaultLibFileName { get; }
#endregion

#region (virtual) ParseLoadData
#region (virtual) HandleLoadData
/// <summary>
/// Parse custom object passed into <see cref="LoadManagerBase{T}.GlobalInit()"/>.
/// Handle custom object passed into <see cref="LoadManagerBase{T}.GlobalInit()"/>.
/// </summary>
/// <param name="data">Custom object to be passed to <see cref="LoadManagerBase{T}.GlobalInit()"/>.</param>
protected virtual void ParseLoadData(object data)
/// <param name="data">Custom object has been passed to <see cref="LoadManagerBase{T}.GlobalInit()"/>.</param>
protected virtual void HandleLoadData(object data)
{

}
Expand Down
6 changes: 5 additions & 1 deletion Joveler.DynLoader/Joveler.DynLoader.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ Supports Windows, Linux, and macOS.</Description>
<PackageProjectUrl>https://github.com/ied206/Joveler.DynLoader</PackageProjectUrl>
<PackageIcon>images\Logo.png</PackageIcon>
<RepositoryUrl>https://github.com/ied206/Joveler.DynLoader</RepositoryUrl>
<PackageReleaseNotes>- Allow passing arbitrary objects to GlobalInit().</PackageReleaseNotes>
<PackageReleaseNotes>- Allow passing a custom object when loading a native library.
- Add `LoadManagerBase.GlobalInit()` overloadings with custom object parameter.
- Add `DynLoaderBase.LoadLibrary()` overloadings with custom object parameter.
- Add virtual method `DynLoaderBase.HandleLoadData()`.
- Add helper method `DynLoaderBase.HasFuncSymbol()`.</PackageReleaseNotes>
<PackageTags>native pinvoke interop dynamic library loader dll so dylib</PackageTags>
</PropertyGroup>
<!-- PackageReference -->
Expand Down
18 changes: 9 additions & 9 deletions Joveler.DynLoader/LoadManagerBase.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (C) 2019-2021 Hajin Jang
Copyright (C) 2019-2023 Hajin Jang
Licensed under MIT License.
MIT License
Expand Down Expand Up @@ -161,20 +161,20 @@ public void GlobalInit(string libPath)
}

/// <summary>
/// Create DynLoaderBase singleton instance in a thread-safe way.
/// Create DynLoaderBase singleton instance in a thread-safe way, with a custom object.
/// </summary>
/// <param name="data">Custom object to be passed to <see cref="DynLoaderBase{T}.ParseLoadData()"/>.</param>
public void GlobalInit(object data)
/// <param name="loadData">Custom object to be passed to <see cref="DynLoaderBase{T}.ParseLoadData()"/>.</param>
public void GlobalInit(object loadData)
{
GlobalInit(null, data);
GlobalInit(null, loadData);
}

/// <summary>
/// Create DynLoaderBase singleton instance in a thread-safe way.
/// Create DynLoaderBase singleton instance in a thread-safe way, with a custom object.
/// </summary>
/// <param name="libPath">A native library file to load.</param>
/// <param name="data">Custom object to be passed to <see cref="DynLoaderBase{T}.ParseLoadData()"/>.</param>
public void GlobalInit(string libPath, object data)
/// <param name="loadData">Custom object to be passed to <see cref="DynLoaderBase{T}.ParseLoadData()"/>.</param>
public void GlobalInit(string libPath, object loadData)
{
lock (_loadLock)
{
Expand All @@ -183,7 +183,7 @@ public void GlobalInit(string libPath, object data)

Lib = CreateLoader();
PreInitHook();
Lib.LoadLibrary(libPath, data);
Lib.LoadLibrary(libPath, loadData);
PostInitHook();
}
}
Expand Down
2 changes: 1 addition & 1 deletion Joveler.DynLoader/NativeMethods.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (C) 2019-2021 Hajin Jang
Copyright (C) 2019-2023 Hajin Jang
Licensed under MIT License.
MIT License
Expand Down
2 changes: 1 addition & 1 deletion Joveler.DynLoader/PlatformConvention.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (C) 2019-2021 Hajin Jang
Copyright (C) 2019-2023 Hajin Jang
Licensed under MIT License.
MIT License
Expand Down
2 changes: 1 addition & 1 deletion Joveler.DynLoader/SafeLibHandle.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (C) 2019-2021 Hajin Jang
Copyright (C) 2019-2023 Hajin Jang
Licensed under MIT License.
MIT License
Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ The library provides advanced p/invoke functionality of C functions using [Nativ
| Linux | NativeLibrary, libdl | x64, armhf, arm64 |
| macOS | NativeLibrary, libdl | x64, arm64 |

### Helps needed!

- Android support and testing
- While I guess Android support on .NET Standard 2.0 target may be similar to Linux, I do not have any time to test on Android right now.
- On .NET/.NET Core, availibity of the `NativeLibrary` on Android has not been tested yet.

## Usage

See [USAGE.md](./USAGE.md).
Expand Down
Loading

0 comments on commit d097eba

Please sign in to comment.