簡體   English   中英

如何將變量參數va_list從托管C ++傳遞到C#?

[英]How to pass variable arguments va_list from managed C++ to C#?

我正在開發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 '的簽名。

我可以更改' write '的簽名。

如何將va_list轉換為托管變量args數組?

[編輯]方法' internWrite '的注釋提到:

-format + args:格式化打印,語法與printf函數相同

也許我需要使用參數' format '來獲取va_list的長度(如使用變量列表參數時提到的va_list的長度? )。 但是我該怎么辦呢? printf命令如何執行?

[編輯]假設format + args具有與printf相同的語法,我創建了一種方法來獲取agrs的長度(以count%為單位)。 這是我目前的代碼:

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] 如何使用C ++ / CLI包裝器將變量參數從托管傳遞到非托管?
[2] 從非托管代碼中調用帶有可變數量參數的.NET函數

似乎您需要解析format參數,以便確定參數的數量和參數的類型。 va_list似乎不包含類型信息。

一個建議,如果您真的想走這條路,那就是閱讀vsnprintf文檔,但是看來您還需要做一些工作!

甚至

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM