测试本机库中的可用入口点

Test for available entry point in native library

我正在为 C# 中的 C 库开发跨平台包装器。这个库存在不同的版本,它们在一些功能上有所不同。

如果这些功能可用,我想在包装器中启用它们。

为了在 C 中使用它,有一个关于如何测试这些函数的文档: http://jackaudio.org/api/group__WeakLinkage.html,即

if (jack_set_latency_callback) {
   jack_set_latency_callback (jill_client, jill_latency_callback, arg);
}

我的 C# 包装器定义为

[DllImport (Constants.JACK_LIB_NAME, 
    CallingConvention = CallingConvention.Cdecl, 
    EntryPoint = "jack_set_latency_callback")]
public static extern unsafe int SetLatencyCallback (UnsafeStructs.jack_client_t* client, 
    Callbacks.JackLatencyCallback latencyCallback, 
    IntPtr arg);

现在,当我使用不受支持的旧版本调用此函数时,我当然会得到 EntryPointNotFoundException。如果此入口点可用,我该如何测试?

这不仅适用于 Windows,而且适用于 Linux 和 Mac OS X.

上的 Mono

调用LoadLibrary加载DLL。然后调用GetProcAddress,传递LoadLibrary返回的模块句柄,以及入口点名称,测试命名的入口点point是否被导出。

这两个函数记录在 MSDN 上,您可以通过网络搜索找到该文档。 p/invokes 很容易编写,但您也可以使用 http://pinvoke.net.

提供的版本

在您对问题的编辑中,您介绍了 Mono。好吧,答案基本上是一样的,但是您使用 dlopendlsym 代替 LoadLibraryGetProcAddress.