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

本文关键字:入口 本机 测试 | 更新日期: 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。好吧,答案基本上是一样的,但是您使用dlopendlsym代替LoadLibraryGetProcAddress.