C 和 C# 互操作的问题

本文关键字:问题 互操作 | 更新日期: 2023-09-27 17:56:45

我在从 C# 代码调用 C 函数时遇到问题。我想为 VLC 播放器添加一些功能(我们通过 vlcdotnet 在我们的软件中使用它),并使用 mingw 在我的 ubuntu 12.10 for Windows 上交叉编译它。我写了一个函数,我们称之为Foo:

__declspec(dllexport) void Foo(vlc_object_t* bar);

现在我想从 C# 调用它:

[LibVlcFunction("Foo")]
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void Foo(IntPtr pointer);
........
public LibVlcFunction<Foo> Foo { get; private set; }
......
Foo = new LibVlcFunction<Foo>(myLibVlcCoreDllHandle, VlcVersion);

它失败了。在 LibVlcFunction 的构造函数中,我们结合了 GetProcAddress 和 GetDelegateForFunctionPointer。GetProcAddress 失败,并显示"函数'Foo'的地址不存在..."但Dumpbin和Dep. Walker说功能存在,她的名字没有被破坏。我尝试编写一个加载 libvlc 的 C++ 应用程序.dll并获取指向我的函数的指针,它起作用了。但在 C# 中它失败了。我该怎么办?有什么建议吗?

C 和 C# 互操作的问题

尽量不使用 stdcall,而是使用 cdecl,如下所示:

 extern "C" __declspec(dllexport) void Foo(vlc_object_t* bar);

您的平台调用调用,如下所示:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
public class libvlc
{
    [DllImport("the-vlc.dll", EntryPoint = "Foo")]
    extern public static void Foo( IntPtr bar );
}

您将vlc_object_t*视为不透明的句柄。 你只需将它们传来传去。 这假设vlc_object_t在您的 VLC 共享库(即在 DLL 中)中分配和释放。