测试本机库中的可用入口点
本文关键字:入口 本机 测试 | 更新日期: 2023-09-27 18:35:51
我正在为 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
返回的模块句柄和入口点名称,以测试是否导出命名的入口点。
这两个函数记录在 MSDN 上,Web 搜索将带您访问本文档。p/invokes 很容易编写,但您也可以使用 http://pinvoke.net 提供的版本。
在对问题的编辑中,您介绍了Mono。好吧,答案基本上是一样的,但是您使用dlopen
和dlsym
代替LoadLibrary
和GetProcAddress
.