2016-07-05 99 views
6

在Linux上的.NET核心中是否有辦法實現P/Invoke (dllimport)在.net核心與Linux的P-Invoke

例如:

我有用.net框架編譯的C++ MyLib.dll。

如果可以這樣使用,或者不支持使用.net-core與linux調用本機win api?

[DllImport("MyLib.dll", CallingConvention = CallingConvention.StdCall)] 
internal static extern long NativeMethod(); 
+2

你試過了嗎?它是如何失敗的? – svick

+0

微軟已經使用了很多PInvoke來開發.NET Core本身,所以我很驚訝,你問。 –

回答

11

PInvoke肯定受支持(這就是所有與操作系統接口的代碼的工作方式),但不是在列出的特定情況下。你不能在Linux上調用一個win32二進制文件,除非你自己爲Linux編寫了一個功能兼容的版本。更現實的情況是,你需要從一些其他系統二進制文件中找到一個Linux函數,這些二進制文件會提供類似的功能,然後用它來代替。

5

即使dll只存在於Windows操作系統中,您可以使用.NET Core中的PInvoke導入並使用一些linux API。

樣品:

[DllImport("libc")] 
static extern int read(int handle, byte[] buf, int n); 

[DllImport("libc.so.6")] 
private static extern int getpid(); 

[DllImport("libgtk-x11-2.0.so.0")] 
static extern IntPtr gtk_message_dialog_new(IntPtr parent_window, DialogFlags flags, MessageType type, ButtonsType bt, string msg, IntPtr args); 

請參閱https://developers.redhat.com/blog/2016/09/14/pinvoke-in-net-core-rhel/

https://gist.github.com/martinwoodward/f5b195aa53b4ed52cabaf701486baa79