测试本机库中的可用入口点
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。好吧,答案基本上是一样的,但是您使用 dlopen
和 dlsym
代替 LoadLibrary
和 GetProcAddress
.
我正在为 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。好吧,答案基本上是一样的,但是您使用 dlopen
和 dlsym
代替 LoadLibrary
和 GetProcAddress
.