C# 测试本机库中的可用入口点
我正在为C#中的C库开发一个跨平台包装器。此库存在于不同的版本中,它们因某些功能而有所不同 在包装器中,如果这些函数可用,我希望启用它们 对于在C中使用它,有一个关于如何测试这些函数的文档: ,即 我的C#包装器定义为C# 测试本机库中的可用入口点,c#,.net,mono,pinvoke,C#,.net,Mono,Pinvoke,我正在为C#中的C库开发一个跨平台包装器。此库存在于不同的版本中,它们因某些功能而有所不同 在包装器中,如果这些函数可用,我希望启用它们 对于在C中使用它,有一个关于如何测试这些函数的文档: ,即 我的C#包装器定义为 [DllImport (Constants.JACK_LIB_NAME, CallingConvention = CallingConvention.Cdecl, EntryPoint = "jack_set_latency_callback")] publi
[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很容易编写,但您也可以使用提供的版本
在对问题的编辑中,您介绍了Mono。好的,答案基本上是一样的,但是您使用
dlopen
和dlsym
代替LoadLibrary
和GetProcAddress
这将在Windows上工作,但解决方案也应该在Linux和Mac上使用Mono。我已经相应地更新了这个问题。这不是我想要的droid ^w解决方案,因为我想将特定于平台的代码降到最低。这里需要特定于平台的代码,因为您使用的是不同的平台。将其包装起来很容易,这样您的消费代码就不必知道平台依赖关系。当然,您可以只处理EntryPointNotFoundException
。无论如何,我很抱歉,我没有达到你的期望。是的,我知道。也许另一个用户会弹出另一个解决方案。自从我回答这个问题以来,这个问题被更改了两次,这让人非常沮丧。只是想让你知道。
[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);