如何将变量参数va_list从托管C ++传递给C#?

时间:2014-12-19 13:48:05

标签: c# c++-cli

我正在开发一个C ++ / CLI库,我有以下类:

public ref class AbstractClassA abstract{
  protected:
    // signature can be changed by me (method will be overriden in C#)
    virtual void write(String ^ str, String ^ format, ...array<Object^> ^args) = 0; 
  internal:
    // signature cannot be changed by me
    void internWrite(const char *str, const char *format, va_list args){
      write(gcnew String(str), gcnew String(format), ???)}
};

方法' internWrite '必须调用方法' methodA ',但我无法找到如何转换' va_list '托管数组的参数。 我找到了一些有趣的帖子[1],[2]但是提到的解决方案需要有' va_list '长度。我没有这些信息,也无法更改' internWrite '的签名。

我可以更改''的签名。

如何将va_list转换为托管变量args数组?

[编辑] 方法' internWrite '的注释提及:

  

-format + args:格式化打印,与printf函数相同的语法

也许我需要使用参数' format '来获取va_list的长度(如length of va_list when using variable list arguments?所述)。但是我该怎么做呢? printf命令如何做到这一点?

[编辑]假设格式+ args与printf具有相同的语法,我创建了一种方法来获得agrs的长度(通过计算'%')。 这是我目前的代码:

void write(char *format, va_list args){
    String^ mgFormat = gcnew String(format);
    int nbArgs = sizeOfArgs(format);
    array<Object^>^ mgArgs = gcnew array<Object^>(nbArgs);

    va_start(args, format);
    for (int _i = 0; _i < nbArgs; ++_i){
        mgArgs[_i] = va_arg(args, int); // not sure the type is int ... how to know ?
    }
    va_end(args);
    internWrite(mgFormat, mgArgs);
    }

但现在我不得不将每个arg对象添加到数组中,因为宏'va_arg'需要当前参数的类型。我没有这个信息。如何迭代va_list并填充我的托管数组?

[1] How do I pass variable arguments from managed to unmanaged with a C++/CLI Wrapper?
[2] Calling a .NET function with variable number of parameters from unmanaged code

1 个答案:

答案 0 :(得分:0)

似乎你需要解析format参数,以确定参数的数量和参数的类型。 va_list不包含类型信息,似乎是。

如果你真的想走这条路,那么建议是阅读vsnprintf文档,但似乎有些工作摆在你面前!

即使