如何P / Invoke" __ arglist"功能?

时间:2015-08-24 06:35:56

标签: c# c++ pinvoke argument-passing

背景
我在C ++中编写了以下函数:

extern "C" __declspec(dllexport) int test(const char*, ...);

我正在使用P / Invoke从C#中调用它:

[DllImport("foo/bar.dll", EntryPoint = "test")]
public static unsafe extern int __unmanaged__test(byte* buffer, __arglist);

<小时/> 的问题:
我需要动态初始化__arglist,这意味着我有Array<object>,我必须在调用C ++函数之前将其转换为__arglist

我尝试过以下操作,但它返回编译错误:

unsafe {
    byte[] buffer = ....
    object[] args = ....

    // ....

    fixed (byte* ptr = buffer)
        return __unmanaged__test(ptr, __arglist(args)); // <--ERROR
}

有谁知道解决这个问题的方法?

<小时/> 对于那些不知道 __arlist 的人:http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx

1 个答案:

答案 0 :(得分:0)

评论Luuan写道(see here)有我需要的解决方案:

引用

  

如果你需要动态构建__arglist(也就是说,你事先不知道参数的类型和数量),你可能不得不使用反射。
  例如,请参阅stackoverflow.com/questions/29458616/…