我正在为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。
答案 0 :(得分:4)
调用LoadLibrary
加载DLL。然后调用GetProcAddress
,传递LoadLibrary
返回的模块句柄和入口点名称,以测试是否导出指定的入口点。
MSDN上记录了这两个函数,网络搜索将带您进入本文档。 p / invokes很容易编写,但你也可以使用http://pinvoke.net提供的版本。
在编辑问题时,您将介绍Mono。好吧,答案基本相同,但您使用dlopen
和dlsym
代替LoadLibrary
和GetProcAddress
。