在.Net Core中,您可以使用[DllImport]进行PInvoke,
但是如果你想动态加载和映射本机api调用,DllImport并没有解决问题。
在Windows上,我们使用DllImport到LoadModule处理了这个问题。然后你可以使用GetProcAddress将地址映射到你可以调用的委托,有效地动态加载api调用。
有没有办法在.Net Core中开箱即用,这样你的逻辑加载就可以在Linux,Mac OSX和Windows上跨平台工作?
这可以建立,但是在我追逐那只兔子之前,我试图看看是否有办法做到这一点。
答案 0 :(得分:4)
一个可能的解决方案与my answer的问题Load unmanaged static dll in load context有关:
您可以在AssemblyLoadContext软件包中使用System.Runtime.Loader。
您对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);
}
runtimes/platform/native/
是nupkg convention,但是您可以使用任何喜欢的路径。
您的pinvoke方法将类似于:
[DllImport("nng", CallingConvention = CallingConvention.Cdecl)]
public static extern int nng_aio_alloc(out nng_aio aio, AioCallback callback, IntPtr arg);
通过共享接口调用nng_aio_alloc
之类的本机方法将触发nng
库的加载,然后您的LoadUnmanagedDll()
函数将被调用。
答案 1 :(得分:1)
在.NetCore Repo上打开一个问题之后,我被告知这将被添加到.Net Core,但不会在2.1中。
目前,github上的用户创建了一个Prototype Implementation: