c# - 当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?

标签 c# c++ com interop regasm

我正在使用 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/

相关文章:

c# - 使用 Rhino 模拟模拟 ASPNET MVC DependencyResolver

c# - 将 COM 对象添加到托管代码

c++ - 文字 charT 数组

c++ - 从 win32 应用程序使用 Excel 2007

用于免注册激活的 COM 组件

c# - WPF:如何在动态创建的 WPF 窗口中动态添加控件

c# - 在 asp.net-core MVC 应用程序上需要 DocumentDB

c# - For 循环的返回值

c++ - 你会如何解决这个问题?老式学生/类(class)/学校代码。这是我的方法 :

c++ - OpenCV 多线程给出错误