2017-07-14 24 views
0

TL; DR特定のC++メソッドシグネチャに対して誤ったバインディングコードが生成されます。 TypeMapsやパスを使用してこれを修正するにはどうすればよいですか?私が使用できる型変換のドキュメントや例はありますか?CppSharpが間違ったコードを生成します

私はCppSharpを使用して、OBSスタジオ用のC#バインディングを生成し、プラグインを作成します。

以下の生成使用OBS.hからコードを生成する場合:

class OBSBindingsGenerator: ILibrary 
{ 
    public void Postprocess(Driver driver, ASTContext ctx) 
    { 
    } 

    public void Preprocess(Driver driver, ASTContext ctx) 
    { 
    } 

    public void Setup(Driver driver) 
    { 
     var options = driver.Options; 
     options.GeneratorKind = CppSharp.Generators.GeneratorKind.CSharp; 
     var module = options.AddModule("OBS"); 
     module.IncludeDirs.Add(@"path\to\libobs"); 
     module.Headers.Add("obs.h"); 
    } 

    public void SetupPasses(Driver driver) 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ConsoleDriver.Run(new OBSBindingsGenerator()); 
    } 
} 

を私はそれが生成することが判明:

[SuppressUnmanagedCodeSecurity] 
    [DllImport("OBS", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, 
     EntryPoint="video_format_get_parameters")] 
    [return: MarshalAs(UnmanagedType.I1)] 
    internal static extern bool VideoFormatGetParameters_0(global::OBS.VideoColorspace color_space, global::OBS.VideoRangeType range, float matrix, float min_range, float max_range); 

と対応する公開方法

public static bool VideoFormatGetParameters(global::OBS.VideoColorspace color_space, global::OBS.VideoRangeType range, float[] matrix, float[] min_range, float[] max_range) 
{ 
    ... // Code snipped for brevity 
    fixed (float* __ptr4 = max_range) 
    { 
     var __arg4 = new global::System.IntPtr(__ptr4); 
     // See here that __arg4 is an IntPtr argument and is being passed to a float parameter 
     var __ret = __Internal.VideoFormatGetParameters_0(color_space, range, __arg2, __arg3, __arg4); 
     return __ret; 
    } 
} 

明らかにこのコンパイルされません。 C++定義は:手書きのPInvokeで

EXPORT bool video_format_get_parameters(enum video_colorspace color_space, 
    enum video_range_type range, float matrix[16], 
    float min_range[3], float max_range[3]); 

、これは(フロート部材の適切な数、又は[MarshalAs(UnmanagedType.LPArray, SizeConst = 3)]有する構造体とフロート[]パススルーを宣言するかのPInvokeを宣言する多くの方法で固定することができます。 IntPtrとしてのパラメータ)。

私の質問は次のとおりです。適切な翻訳を行うために、CppSharpとそのコード変換ツール(TypeMap?Pass?What?)を使用するにはどうすればよいですか?私はこれをハックとして修正することができましたが、私のC++ライブラリと相互に作用するので、私はCppSharp(魚を学ぶこと)を使ってこれを行う正しい方法を学ぶことを好むでしょう。

ありがとうございます!

答えて

0

最新のCppSharpバージョン(0.8.14+)で試してください。アレイパラメータに関する修正が含まれています。

関連する問題