代码之家  ›  专栏  ›  技术社区  ›  Residuum

尝试分配指针容器时出现P/Invoke EntryPointNotFoundException

  •  0
  • Residuum  · 技术社区  · 14 年前

    我试图在下面的Alsa函数上调用DllImport(从 documentation :

    #define snd_seq_client_info_alloca( ptr )  __snd_alloca(ptr, snd_seq_client_info)
    

    分配一个snd_seq_client_info_t 堆叠的容器

    这里是我在C++中发现的一个实现 application 类似于我想在Mono中完成的任务:

    snd_seq_client_info_t* cinfo;
    snd_seq_client_info_alloca(&cinfo);
    

    到目前为止,我所拥有的一切,但都不管用:

    [DllImport(libasound.so.2)]
    private static extern void snd_seq_client_info_alloca(out IntPtr ptr);
    
    internal static void MyFunction ()
    {
        IntPtr clientInfo = IntPtr.Zero;
        snd_seq_client_info_alloca(out clientInfo);
        // and then some more ...
    }
    

    但我有个例外:

    System.EntryPointNotFoundException: snd_seq_client_info_alloca
    at (wrapper managed-to-native)   
    MonoMultiJack.ConnectionWrapper.Alsa.LibAsoundWrapper:snd_seq_client_info_alloca (intptr&)
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   dtb    14 年前

    snd_seq_client_info_alloca 是预处理器宏。不能调用预处理器宏,只能正确导出函数。

    客户信息分配 扩展到 __snd_alloca 它也是一个预处理器宏。

    __阿洛卡岛 本质上扩展为调用 alloca . 你可以试着用C#重写。但我相信,如果调用方是托管代码,那么在调用方的堆栈帧中分配内存是没有多大意义的。

    只需在其他地方分配一些内存(例如,使用 Marshal.AllocHGlobal ).