如何从clr程序集返回char *数组?

时间:2010-03-04 23:13:45

标签: .net c++ unmanaged

我有一个简单的托管C ++程序集,我为C#程序集中的一些静态方法提供了非托管包装器。其中一个方法返回一个字符串,我在C ++程序集中将其转换为“const char *”类型。我遇到的麻烦是,当我从非托管源加载此dll时,我会在指针中返回错误的数据。我该怎么办?我已将我的测试用例简化为:

托管程序集(使用/ clr编译的Test.dll;完整代码如下):

extern "C" {
    __declspec(dllexport) const char* GetValue(const char* s) {
        return s;
    }
}

非托管控制台win32 app:

#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>

typedef const char* (*GetValueFunc)(const char* s);

int _tmain(int argc, _TCHAR* argv[]) {
    wprintf(L"Hello from unmanaged code\n");
    HMODULE hDll = LoadLibrary(L"Test.dll");
    if (!hDll)
        return GetLastError();

    wprintf(L"library found and loaded\n");

    GetValueFunc getValue = (GetValueFunc)GetProcAddress(hDll, "GetValue");
    if(!getValue)
        return GetLastError();
    wprintf(L"%s\n", getValue("asdf"));

    return 0;
}

我得到前两行就好了,但出来的第三行是垃圾。如果我让dll在cpp文件的顶部有“#pragma unmanaged”,也没关系(结果相同)。

1 个答案:

答案 0 :(得分:2)

带有%s格式说明符的

wprintf会将您的第一个参数解释为“const wchar_t *”,而您将“const char *”传递给它。尝试在GetValue函数中使用wchar_t。