csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.9 KiB
128 lines
3.9 KiB
// Copyright (c) The Avalonia Project. All rights reserved.
|
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
/*
|
|
* Source code imported from https://github.com/kekekeks/evhttp-sharp
|
|
* Source is provided under MIT license for Avalonia project and derived works
|
|
*/
|
|
|
|
namespace Avalonia.Native
|
|
{
|
|
internal interface IDynLoader
|
|
{
|
|
IntPtr LoadLibrary(string dll);
|
|
IntPtr GetProcAddress(IntPtr dll, string proc, bool optional);
|
|
|
|
}
|
|
|
|
class UnixLoader : IDynLoader
|
|
{
|
|
// ReSharper disable InconsistentNaming
|
|
static class LinuxImports
|
|
{
|
|
[DllImport("libdl.so.2")]
|
|
private static extern IntPtr dlopen(string path, int flags);
|
|
|
|
[DllImport("libdl.so.2")]
|
|
private static extern IntPtr dlsym(IntPtr handle, string symbol);
|
|
|
|
[DllImport("libdl.so.2")]
|
|
private static extern IntPtr dlerror();
|
|
|
|
public static void Init()
|
|
{
|
|
DlOpen = dlopen;
|
|
DlSym = dlsym;
|
|
DlError = dlerror;
|
|
}
|
|
}
|
|
|
|
static class OsXImports
|
|
{
|
|
[DllImport("/usr/lib/libSystem.dylib")]
|
|
private static extern IntPtr dlopen(string path, int flags);
|
|
|
|
[DllImport("/usr/lib/libSystem.dylib")]
|
|
private static extern IntPtr dlsym(IntPtr handle, string symbol);
|
|
|
|
[DllImport("/usr/lib/libSystem.dylib")]
|
|
private static extern IntPtr dlerror();
|
|
|
|
public static void Init()
|
|
{
|
|
DlOpen = dlopen;
|
|
DlSym = dlsym;
|
|
DlError = dlerror;
|
|
}
|
|
|
|
}
|
|
|
|
[DllImport("libc")]
|
|
static extern int uname(IntPtr buf);
|
|
|
|
static UnixLoader()
|
|
{
|
|
var buffer = Marshal.AllocHGlobal(0x1000);
|
|
uname(buffer);
|
|
var unixName = Marshal.PtrToStringAnsi(buffer);
|
|
Marshal.FreeHGlobal(buffer);
|
|
if (unixName == "Darwin")
|
|
OsXImports.Init();
|
|
else
|
|
LinuxImports.Init();
|
|
}
|
|
|
|
private static Func<string, int, IntPtr> DlOpen;
|
|
private static Func<IntPtr, string, IntPtr> DlSym;
|
|
private static Func<IntPtr> DlError;
|
|
// ReSharper restore InconsistentNaming
|
|
|
|
static string DlErrorString() => Marshal.PtrToStringAnsi(DlError());
|
|
|
|
public IntPtr LoadLibrary(string dll)
|
|
{
|
|
var handle = DlOpen(dll, 1);
|
|
if (handle == IntPtr.Zero)
|
|
throw new Exception(DlErrorString());
|
|
return handle;
|
|
}
|
|
|
|
public IntPtr GetProcAddress(IntPtr dll, string proc, bool optional)
|
|
{
|
|
var ptr = DlSym(dll, proc);
|
|
if (ptr == IntPtr.Zero && !optional)
|
|
throw new Exception(DlErrorString());
|
|
return ptr;
|
|
}
|
|
}
|
|
|
|
internal class Win32Loader : IDynLoader
|
|
{
|
|
[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
|
|
private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
|
|
|
|
[DllImport("kernel32", EntryPoint = "LoadLibraryW", SetLastError = true, CharSet = CharSet.Unicode)]
|
|
private static extern IntPtr LoadLibrary(string lpszLib);
|
|
|
|
IntPtr IDynLoader.LoadLibrary(string dll)
|
|
{
|
|
var handle = LoadLibrary(dll);
|
|
if (handle != IntPtr.Zero)
|
|
return handle;
|
|
var err = Marshal.GetLastWin32Error();
|
|
|
|
throw new Exception("Error loading " + dll + " error " + err);
|
|
}
|
|
|
|
IntPtr IDynLoader.GetProcAddress(IntPtr dll, string proc, bool optional)
|
|
{
|
|
var ptr = GetProcAddress(dll, proc);
|
|
if (ptr == IntPtr.Zero && !optional)
|
|
throw new Exception("Error " + Marshal.GetLastWin32Error());
|
|
return ptr;
|
|
}
|
|
}
|
|
}
|