3

C# コードから C 関数を呼び出すのに問題があります。VLCプレーヤーにいくつかの機能を追加したいと思い(vlcdotnetを介してソフトウェアで使用しています)、mingwを使用してWindows用のubuntu 12.10でクロスコンパイルしました。関数を書きました。それを 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.dll をロードして func へのポインターを取得する 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 に答える