C# 能否在.Net Core中动态加载跨平台本机/非托管DLL/libs?

C# 能否在.Net Core中动态加载跨平台本机/非托管DLL/libs?,c#,.net-core,asp.net-core-mvc,asp.net-core-2.0,asp.net-core-1.0,C#,.net Core,Asp.net Core Mvc,Asp.net Core 2.0,Asp.net Core 1.0,在.Net Core中,您可以使用[DllImport]进行PInvoke 但是,如果您想动态加载和映射本机api调用,DllImport无法解决这个问题 在windows上,我们使用DllImport-to-LoadModule处理此问题。然后,您可以使用GetProcAddress将地址映射到一个委托,然后可以调用该委托,从而有效地动态加载api调用 是否有任何方法可以在.NETCore开箱即用中实现这一点,以便在Linux、MacOSX和Windows上跨平台执行加载操作 这是可以建立的,

在.Net Core中,您可以使用[DllImport]进行PInvoke

但是,如果您想动态加载和映射本机api调用,DllImport无法解决这个问题

在windows上,我们使用DllImport-to-LoadModule处理此问题。然后,您可以使用GetProcAddress将地址映射到一个委托,然后可以调用该委托,从而有效地动态加载api调用

是否有任何方法可以在.NETCore开箱即用中实现这一点,以便在Linux、MacOSX和Windows上跨平台执行加载操作


这是可以建立的,但在我追逐那只兔子之前,我想看看是否有办法做到这一点。

在.NetCore回购协议上打开一个问题后,我被告知这将被添加到.NetCore,但不会在2.1中

目前,用户在github上创建了一个原型实现,位于以下位置:


一个可能的解决方案与SO问题有关:

你可以在包装中使用

LoadUnmanagedDll()
的实现包含加载依赖于平台的本机库的逻辑:

string arch = Environment.Is64BitProcess ? "-x64" : "-x86";
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
    var fullPath = Path.Combine(assemblyPath, "runtimes", "osx" + arch, "native", "libnng.dylib");
    return LoadUnmanagedDllFromPath(fullPath);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    var fullPath = Path.Combine(assemblyPath, "runtimes", "linux" + arch, "native", "libnng.so");
    return LoadUnmanagedDllFromPath(fullPath);
}
else // RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
{
    var fullPath = Path.Combine(assemblyPath, "runtimes", "win" + arch, "native", "nng.dll");
    return LoadUnmanagedDllFromPath(fullPath);
}
运行时/platform/native/
是最常用的路径,但您可以使用任何您喜欢的路径

您的pinvoke方法将类似于:

[DllImport("nng", CallingConvention = CallingConvention.Cdecl)]
public static extern int nng_aio_alloc(out nng_aio aio, AioCallback callback, IntPtr arg);

通过共享接口调用一个本地方法,如
nng\u aio\u alloc
,将触发
nng
库的加载,您的
LoadUnmanagedDll()
函数将被调用。

我没有尝试过,但我在这里找到了几个示例,请查看此页面上的文本“getpid(2)是标准的POSIX系统调用”看到Linux例子:抱歉,意识到这个例子是使用dLimPalt……在运行时有使用DLIMPART的方法,但是我不确定这将如何转化为核心/其他平台:如果你不在这里得到牵引力,你可能会考虑在GITHUB上打开一个核心问题,因为它们实现了跨平台的DllImport,它们可能有更好的解决方案来运行时导入,或者考虑将其添加为一个特性。虽然他们可能会把它放在较低的优先级。谢谢你,我打开了一个问题,得到了很好的回应。它将在将来添加到.NetCore中,但不会添加到2.1中。然而,有人已经实现了我想写的东西作为原型。NetCore:这接近于我正在考虑构建的概念。我想我将进一步调整它,以便它能够处理DLOpen的备用linux库。