3

从我的 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。沃克说功能存在,她的名字没有被破坏。我试图编写一个加载 libvlc.dll 并获取指向我的函数的指针的 C++ 应用程序,它可以工作。但在 C# 中它失败了。我该怎么办?有什么建议么?

4

1 回答 1

0

尝试不使用 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 中)中分配和释放。

于 2013-04-17T21:30:14.260 回答