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

时间:2016-02-22 14:19:16

标签: c# .net mono pinvoke

我正在为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。

1 个答案:

答案 0 :(得分:4)

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

MSDN上记录了这两个函数,网络搜索将带您进入本文档。 p / invokes很容易编写,但你也可以使用http://pinvoke.net提供的版本。

在编辑问题时,您将介绍Mono。好吧,答案基本相同,但您使用dlopendlsym代替LoadLibraryGetProcAddress