У меня есть обратный вызов COM из неуправляемой библиотеки DLL, которую мне нужно использовать в С#.
Неуправляемая DLL ожидает, что вызывающий абонент будет выделять память с помощью LocalAlloc (который будет вызывать LocalFree), заполнить его WSTR и установить value и chars на указатель WSTR и длину строки соответственно.
Фрагмент кода, который я пытаюсь преобразовать в С#:
STDMETHODIMP CMyImpl::GetString(LPCSTR field, LPWSTR* value, int* chars) {
    CStringW ret;
    if (!strcmp(field, "matrix")) {
        ret = L"None";
        if (...)
            ret.Append(L"001");
        else if (...) 
            ret.Append(L"002");
        else
            ret.Append(L"003");
    }
    if (!ret.IsEmpty()) {
        int len = ret.GetLength();
        size_t sz = (len + 1) * sizeof(WCHAR);
        LPWSTR buf = (LPWSTR)LocalAlloc(LPTR, sz);
        if (!buf) {
            return E_OUTOFMEMORY;
        }
        wcscpy_s(buf, len + 1, ret);
        *chars = len;
        *value = buf;
        return S_OK;
    }
    return E_INVALIDARG; 
}
Каким будет эквивалентный код С#?
EDIT: COM-интерфейс:
 [id(2)] HRESULT GetString([in] LPCSTR field, [out] LPWSTR* value, [out] int* chars);
