gpt4 book ai didi

c# - C 和 C# 互操作的问题

转载 作者:行者123 更新时间:2023-11-30 18:35:41 25 4
gpt4 key购买 nike

我在从 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 说函数存在并且她的名字没有被破坏。我尝试编写一个 C++ 应用程序来加载 libvlc.dll 并获取指向我的 func 的指针并且它有效。但在 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 中)中分配和释放。

关于c# - C 和 C# 互操作的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com