如何从托管C++;到C#?

如何从托管C++;到C#?,c#,c++-cli,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

我正在开发一个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), ???)}
};
public ref class AbstractClassA abstract{
受保护的:
//签名可以由我更改(方法将在C#中重写)
虚空写入(字符串^str、字符串^format、…数组^args)=0;
内部:
//我不能更改签名
void internWrite(常量字符*str,常量字符*格式,变量列表参数){
写入(gcnew字符串(str)、gcnew字符串(格式),???)}
};
方法“internWrite”必须调用方法“methodA”,但我无法找到如何将“va_list”参数转换为托管数组。 我发现了一些有趣的帖子[1],[2],但提到的解决方案需要有“va_列表”的长度。我没有这些信息,我无法更改“internWrite”的签名

我可以更改“写入”的签名。

如何将va_列表转换为托管变量args数组

[编辑] “internWrite”方法的评论提到:

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

也许我需要使用参数“format”来获取va_列表的长度(如上所述)。但是我怎么能做到呢?printf命令是如何做到这一点的?

[编辑]假设format+args与printf具有相同的语法,我创建了一个方法来获取AGR的长度(按“%”的计数)。 这是我目前的代码:

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);
    }
void write(字符*格式,变量列表参数){
字符串^mgFormat=gcnew字符串(格式);
int nbArgs=sizeOfArgs(格式);
数组^mgArgs=gcnew数组(nbArgs);
va_开始(参数,格式);
对于(int_i=0;_i
但是现在我对将每个arg对象添加到数组感到很困惑,因为宏“va_arg”需要当前参数的类型。我没有这方面的资料。如何迭代va_列表并填充我的托管数组?

[1]

[2]

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

如果你真的想沿着这条路走下去,有一个建议是阅读文档,但似乎有一些工作摆在你面前


甚至

对于托管C++/#您必须使用
params
关键字:
func(params object[]arg)。如果您无法获得va_列表的长度,这听起来很难。正如我看到的,您有一个格式字符串,它完美地指定了解析后预期的参数数量。对于类似printf的格式字符串,您可以计算格式字符串中的“%”字符,这些字符的前面或后面没有另一个“%”字符。Géza Törötk:谢谢。因为有人提到它使用printf语法,所以我将按照您的建议计算%。i486:是的,我会在我的C代码中使用这个签名Medinoc:希望我能找到一个解决方案……除非你知道格式字符串被限制为32位类型,否则你不能假设每个参数实际上是一个
int
或至少是相同的大小。您不仅需要对
%
字符进行计数,还需要查看其后面的格式字符,并相应地调整每个
va_arg
的大小。但是我不理解代码示例。您同时显示
write
调用
internWrite
internWrite
调用
write
,这是一个无限循环!您应该制作一个代码示例,清楚地显示调用者和被调用者之间的确切关系,包括使用此类的代码。