none
c++dll中的char*形参如何通过CLR程序传递给C#? RRS feed

  • 问题

  • 工程3层结构,底层是c++的dll,接口如下:
    CPPDLL_API int fnCppDll(char* p)
    {
    for (int i = 0;i < 10;i++)
    {
    *p++ = '0' + i;
    }
    return 1;
    }

    中间层是CLR的dll,接口如下:
    int MgdDll::Class1::getStr(String^ str)
    {
    //interior_ptr p = const_cast>(PtrToStringChars(str));
    fnCppDll(p);
    return 0;
    }

    上层是C# From调用,string str;int rc = 1;rc = cs1.getStr(str);MessageBox.Show(str);

    CLR中间层编译错误:MgdDll.cpp(17): error C2664: “fnCppDll”: 不能将参数 1 从“cli::interior_ptr”转换为“char *” 
    无法将托管类型转换为非托管类型。

    请问如何把C#层的str传递到c++层并返回修改后的串?

    2014年1月25日 5:47

答案

  • 试一下:

    int MgdDll::Class1::getStr(String^ str)
    {
    	fnCppDll(static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str).ToPointer()));
            return 0;
    }
    如果不行,可以试一下Marshal里面的其他的StringTo...函数

    2014年1月26日 8:28