网上搜索了一下,有人提供了办法,测试通过:
public partial class MainWindow : Gtk.Window
{
public MainWindow() : base(Gtk.WindowType.Toplevel)
{
Build();
}
protected void OnDeleteEvent(object sender, DeleteEventArgs a)
{
Application.Quit();
a.RetVal = true;
}
const string NATIVE_PATH = "./libtioplugininterface.so";
const string NATIVE_INIT = "init";
[DllImport("libdl.so")]
protected static extern IntPtr dlopen(string filename, int flags);
[DllImport("libdl.so")]
protected static extern IntPtr dlsym(IntPtr handle, string symbol);
[DllImport("libdl.so")]
protected static extern IntPtr dlclose(IntPtr handle);
const int RTLD_NOW = 2; // for dlopen's flags
private delegate int native_init(int param);
static bool NativeInit()
{
IntPtr hModule = dlopen(NATIVE_PATH, RTLD_NOW);
if (hModule.Equals(IntPtr.Zero))
{
Console.WriteLine("LoadLibrary fail=" + NATIVE_PATH);
return false;
}
Console.WriteLine("dlopen() OK");
IntPtr address = dlsym(hModule, NATIVE_INIT);
if (address == IntPtr.Zero)
{
Console.WriteLine("GetProcAddress fail=" + NATIVE_INIT);
return false;
}
Console.WriteLine("dlsym() OK");
Delegate proc = Marshal.GetDelegateForFunctionPointer(address, typeof(native_init));
int result = ((native_init)proc)(0);
Console.WriteLine("native_init() OK");
dlclose(hModule);
return true;
}
protected void OnButton2Pressed(object sender, EventArgs e)
{
this.button2.Visible = false;
NativeInit();
}
}