Skip to content

Commit 74e70f0

Browse files
committed
Merge master
2 parents a042dc5 + 550f5b0 commit 74e70f0

File tree

6 files changed

+133
-3
lines changed

6 files changed

+133
-3
lines changed

src/FRC-Utilities/NativeLibraryUtilities/EmbeddedLibraryLoader.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,22 @@ void ILibraryLoader.LoadLibrary(string filename)
2828
}
2929
}
3030

31+
/// <summary>
32+
/// Try to load a native library from a path
33+
/// </summary>
34+
/// <param name="filename"></param>
35+
/// <returns></returns>
36+
public bool TryLoadLibrary(string filename)
37+
{
38+
IntPtr dl = dlopen(filename, 2);
39+
if (dl != IntPtr.Zero)
40+
{
41+
NativeLibraryHandle = dl;
42+
return true;
43+
};
44+
return false;
45+
}
46+
3147
/// <inheritdoc/>
3248
IntPtr IFunctionPointerLoader.GetProcAddress(string name)
3349
{

src/FRC-Utilities/NativeLibraryUtilities/ILibraryLoader.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ public interface ILibraryLoader : IFunctionPointerLoader
1717
/// </summary>
1818
/// <param name="filename"></param>
1919
void LoadLibrary(string filename);
20+
21+
/// <summary>
22+
/// Tires to load library from specified file name
23+
/// </summary>
24+
/// <param name="filename"></param>
25+
/// <returns></returns>
26+
bool TryLoadLibrary(string filename);
27+
2028
/// <summary>
2129
/// Unloads the native library
2230
/// </summary>

src/FRC-Utilities/NativeLibraryUtilities/LinuxLibraryLoader.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,22 @@ void ILibraryLoader.LoadLibrary(string filename)
3131
}
3232
}
3333

34+
/// <summary>
35+
/// Try to load a native library from a path
36+
/// </summary>
37+
/// <param name="filename"></param>
38+
/// <returns></returns>
39+
public bool TryLoadLibrary(string filename)
40+
{
41+
IntPtr dl = dlopen(filename, 2);
42+
if (dl != IntPtr.Zero)
43+
{
44+
NativeLibraryHandle = dl;
45+
return true;
46+
};
47+
return false;
48+
}
49+
3450
/// <inheritdoc/>
3551
IntPtr IFunctionPointerLoader.GetProcAddress(string name)
3652
{

src/FRC-Utilities/NativeLibraryUtilities/MacOsLibraryLoader.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,22 @@ void ILibraryLoader.LoadLibrary(string filename)
3030
}
3131
}
3232

33+
/// <summary>
34+
/// Try to load a native library from a path
35+
/// </summary>
36+
/// <param name="filename"></param>
37+
/// <returns></returns>
38+
bool ILibraryLoader.TryLoadLibrary(string filename)
39+
{
40+
IntPtr dl = dlopen(filename, 2);
41+
if (dl != IntPtr.Zero)
42+
{
43+
NativeLibraryHandle = dl;
44+
return true;
45+
};
46+
return false;
47+
}
48+
3349
IntPtr IFunctionPointerLoader.GetProcAddress(string name)
3450
{
3551
dlerror();

src/FRC-Utilities/NativeLibraryUtilities/NativeLibraryLoader.cs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,58 @@ public void LoadNativeLibrary<T>(bool directLoad = false, string? extractLocatio
190190
}
191191

192192
/// <summary>
193-
/// Loads a native library with an assembly holding the native libraries
193+
/// Try to load a native library directly from a path
194+
/// </summary>
195+
/// <param name="libraryName"></param>
196+
/// <returns></returns>
197+
public bool TryLoadNativeLibraryPath(string libraryName)
198+
{
199+
OsType osType = OsType;
200+
201+
if (osType == OsType.None)
202+
throw new InvalidOperationException(
203+
"OS type is unknown. Must use the overload to manually load the file");
204+
205+
ILibraryLoader loader;
206+
207+
switch (osType)
208+
{
209+
case OsType.Windows32:
210+
case OsType.Windows64:
211+
loader = new WindowsLibraryLoader();
212+
libraryName = $"{libraryName}.dll";
213+
break;
214+
case OsType.Linux32:
215+
case OsType.Linux64:
216+
loader = new LinuxLibraryLoader();
217+
libraryName = $"lib{libraryName}.so";
218+
break;
219+
case OsType.MacOs32:
220+
case OsType.MacOs64:
221+
loader = new MacOsLibraryLoader();
222+
libraryName = $"lib{libraryName}.dylib";
223+
break;
224+
case OsType.LinuxAarch64:
225+
case OsType.LinuxRaspbian:
226+
case OsType.roboRIO:
227+
loader = new EmbeddedLibraryLoader();
228+
libraryName = $"lib{libraryName}.so";
229+
break;
230+
default:
231+
throw new InvalidOperationException("Unknown OS type?");
232+
}
233+
234+
bool wasLoaded = loader.TryLoadLibrary(libraryName);
235+
if (wasLoaded)
236+
{
237+
LibraryLoader = loader;
238+
LibraryLocation = libraryName;
239+
}
240+
return wasLoaded;
241+
}
242+
243+
/// <summary>
244+
/// Loads a native library with a reflected assembly holding the native libraries
194245
/// </summary>
195246
/// <param name="assembly">The assembly to load from</param>
196247
/// <param name="localLoadOnRio">True to force a local load on the RoboRIO</param>

src/FRC-Utilities/NativeLibraryUtilities/WindowsLibraryLoader.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.ComponentModel;
23
using System.IO;
34
using System.Runtime.InteropServices;
45
using FRC.ILGeneration;
@@ -17,7 +18,29 @@ void ILibraryLoader.LoadLibrary(string filename)
1718
{
1819
if (!File.Exists(filename))
1920
throw new FileNotFoundException("The file requested to be loaded could not be found");
20-
NativeLibraryHandle = LoadLibrary(filename);
21+
IntPtr dl = LoadLibrary(filename);
22+
if (dl != IntPtr.Zero)
23+
{
24+
NativeLibraryHandle = dl;
25+
return;
26+
}
27+
throw new Win32Exception(Marshal.GetLastWin32Error());
28+
}
29+
30+
/// <summary>
31+
/// Try to load a native library from a path
32+
/// </summary>
33+
/// <param name="filename"></param>
34+
/// <returns></returns>
35+
public bool TryLoadLibrary(string filename)
36+
{
37+
IntPtr dl = LoadLibrary(filename);
38+
if (dl != IntPtr.Zero)
39+
{
40+
NativeLibraryHandle = dl;
41+
return true;
42+
};
43+
return false;
2144
}
2245

2346
IntPtr IFunctionPointerLoader.GetProcAddress(string name)
@@ -36,7 +59,7 @@ void ILibraryLoader.UnloadLibrary()
3659
FreeLibrary(NativeLibraryHandle);
3760
}
3861

39-
[DllImport("kernel32")]
62+
[DllImport("kernel32", SetLastError = true)]
4063
private static extern IntPtr LoadLibrary(string fileName);
4164

4265
[DllImport("kernel32.dll")]

0 commit comments

Comments
 (0)