我正在使用 C++ 应用程序调用 c sharp dll。 Regasm 将我的函数从具有两个字符数组并返回一个 int 转变为一个具有两个 BSTR 和一个长指针作为参数的函数。两个 BSTR 被标记为输入,长指针是我的原始返回值。问题是我的字符数组之一是真实输入,另一个是从 dll 返回的错误信息。是否有标识符让 regasm 知道我的第二个字符串参数实际上是一个输出?在调试时,我验证了第二个参数在 dll 中被更改但没有返回到调用函数。
最佳答案
这确实是 .NET 方法到 COM 方法的正常转换。 BSTR 是标准的字符串互操作类型,它可以非常有力地保证字符串可以跨模块/语言边界正确编码,而不会出现主要的内存管理问题。普通字符串变成 BSTR,ref/out 字符串变成 BSTR*,允许您传回新字符串。与返回类型大致相同,COM 方法必须返回 HRESULT 以指示成功/失败,因此原始返回值必然成为 C# 语言中的 out 参数。
修补这个东西非常是不明智的,有很多方法可以让你大吃一惊。您可以通过应用 [MarshalAs] 属性来强制使用不同的参数类型。 [PreserveSig] 抑制返回值转换。执行此操作时,函数调用不能再跨单元边界进行编码。再次重申,对此要非常小心,尤其是当您想要返回字符串时。这是一个有保证的内存管理问题。在 C++ 中处理 BSTR 或返回值不是问题,您可以在谷歌上搜索大量示例代码。
关于c# - 当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25754189/