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

5 c# c++ com serialization safearray

我用C#编写了COM类,并提供了一个这样的函数:

public void SignAttached(
        byte[] message,
        ref byte[] signedMessage, 
        string userName = "USER"
        )
Run Code Online (Sandbox Code Playgroud)

}

当我尝试从C ++代码调用此函数时,我得到了很多启发:-“等级12536的SafeArray已传递给期望等级1数组的方法,未知错误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);
Run Code Online (Sandbox Code Playgroud)

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

HRESULT SignAttached (
    SAFEARRAY * message,
    SAFEARRAY * * signedMessage,
    _bstr_t userName );
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以帮忙吗?

Mar*_*tin 1

您的 C# 数组参数不会作为 SAFEARRAY 公开给 COM。看看是否可以使用 tlbexp 检查 C# 代码的类型库,然后使用某种工具查看类型库,但我猜测您会看到类似的内容

[in] unsigned char *

[in,out] unsigned char *

对于你的前2个参数。

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

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

编辑:我只是尝试使用该工具,但它似乎并不像我记得的那样好用。不管怎样,我很确定你的类型库不会使用 SAFEARRAY。