Marshall一个托管字符串数组到char * []

时间:2013-06-04 12:54:30

标签: marshalling command-line-interface unmanaged

我想要做的是从托管C ++调用非托管C ++函数:

int runConfig(int argc, char* argv[])

public: static bool CreateConfigurationFile(int parameters, array<String^>^ arguments)

我的问题是如何将托管字符串的托管数组转换为非托管的char *数组?

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

using namespace System;
using namespace System::Runtime::InteropServices;

bool CreateConfigurationFile(int parameters, array<String^>^ arguments)
{
    int length = arguments->Length;
    char** argv = new char*[length];

    for(int i = 0; i < length; ++i)
    {
        argv[i] = (char*)Marshal::StringToHGlobalAnsi(arguments[i]).ToPointer();
    }

    runConfig(length, argv);

    for(int i = 0; i < length; ++i)
    {
        Marshal::FreeHGlobal(IntPtr(argv[i]));
    }

    delete[] argv;

    return true;
}

请注意,未使用int parameters,因为.NET数组具有Length属性。

如果您想使用PInvoke调用runConfig,请使用以下PInvoke声明:

int runConfig(int argc, IntPtr argv);