需要从非托管c ++代码调用托管代码

时间:2013-12-11 09:03:35

标签: c# c++ serialization com safearray

我在C#中编写了COM类,其中一个函数是这样的:

public void SignAttached(
        byte[] message,
        ref byte[] signedMessage, 
        string userName = "USER"
        )

}

当我尝试从C ++代码调用此函数时,我有一个例外: - “等级为12536的SafeArray已传递给期望排名为1.Unknown错误0x80131538的数组的方法”,并且每次更改第一个等级,C ++代码:

SAFEARRAY*message = SafeArrayCreateVector(VT_UI1, 0, 1);
    SAFEARRAY*signedMessage = SafeArrayCreateVector(VT_UI1, 0, 1);

    _bstr_t userName = "USER";

    pInstanse ->SignAttached(message,&signedMessage,userName);

和compilator在* .tlh文件中为函数创建包装器:

HRESULT SignAttached (
    SAFEARRAY * message,
    SAFEARRAY * * signedMessage,
    _bstr_t userName );

如果要查看带有帮助oleviewer(IDL语言)的* .tlb文件,导出功能是:

    HRESULT SignAttached(
                [in] SAFEARRAY(unsigned char) message, 
                [in, out] SAFEARRAY(unsigned char)* signedMessage, 
                [in, optional, defaultvalue("USER")] BSTR userName);

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您的C#数组参数未作为SAFEARRAYs向COM公开。 看看你是否可以使用tlbexp检查C#代码的类型库,然后使用一些工具来查看类型库,但我猜你会看到类似

的内容

[in] unsigned char *

[in,out] unsigned char *

表示您的前两个参数。

我刚在我的机器上找到了oleview.exe(我以为它不再分发了)。在使用tlbexp导出后,您可以使用它来检查您的类型库。我认为如果您还没有安装Windows SDK,则需要安装它。对我来说,oleview.exe在......

C:\Program Files (x86)\Windows Kits\8.0\bin\x86

编辑:我只是尝试使用该工具,它似乎没有像我记得的那样好用。无论如何,我很确定你的typelib不会使用SAFEARRAY。