Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试本机库中的可用入口点_C#_.net_Mono_Pinvoke - Fatal编程技术网

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

我正在为C#中的C库开发一个跨平台包装器。此库存在于不同的版本中,它们因某些功能而有所不同

在包装器中,如果这些函数可用,我希望启用它们

对于在C中使用它,有一个关于如何测试这些函数的文档: ,即

我的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很容易编写,但您也可以使用提供的版本


在对问题的编辑中,您介绍了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);