gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:31 25 4
gpt4 key购买 nike

我用 C# 写了 COM 类,一个函数是这样的:

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

当我尝试从 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);

编译器在 *.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);

有人可以帮忙吗?

最佳答案

您的 C# 数组参数不会作为 SAFEARRAY 暴露给 COM。看看您是否可以使用 tlbexp 检查 C# 代码的类型库,然后使用一些工具查看类型库,但我猜您会看到类似

[in] unsigned char *

[in,out] 无符号字符 *

前两个参数。

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

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

编辑:我刚刚尝试使用该工具,但它似乎并没有我内存中的那么好用。无论如何,我很确定您的类型库不会使用 SAFEARRAY。

关于c# - 需要从非托管 C++ 代码调用托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20514785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com