我可以从Visual Studio生成的方法更改COM Interop方法的签名吗?

时间:2011-06-15 10:12:04

标签: interop com-interop

我们正在使用NET的第三方COM API。目前Visual Studio&可能TLBIMP用于生成Interop包装器DLL。

提供给NET的一种特定方法的生成接口不是我们更喜欢使用的接口。是否可以更改COM互操作代码,以便提交给NET的方法签名不同?我们无法更改COM接口或使用的TLB,因为它是第三方代码。

实际示例如下:

有问题的方法是传递明文密码。目前的代码如下:

  1. 我们的密码处理返回System.Security.SecureString(密码在内存中加密)。
  2. 我们将SecureString编组到BSTR(令人讨厌的明文,但之后可以归零以减少曝光)。
  3. BSTR转换为System.String(糟糕!这将是不可变的,可能永远不会被垃圾收集,并将明文密码保存在内存中)。
  4. COM Interop函数包装第三方库需要System.String&将其再次发送给BSTR。
  5. 第三方COM API采用BSTR,并希望以一种模糊安全的方式处理它。
  6. 步骤2& 3我想避免。我无法改变第三方API处理明文密码这一事实,但我至少希望我们控制的代码能够最大限度地减少内存中明文的存在。

    我想更改.NET方法的签名以获取SecureString而不是String - NET已经可以将SecureString编组到BSTR,因此COM互操作代码仍然可以向实际的COM API提供相同的数据,但没有创建一个字符串的可怕步骤。可以这样做吗?

1 个答案:

答案 0 :(得分:1)

是的,但您需要手动编写互操作界面的代码,然后您可以根据需要更改参数类型。

我可能会首先使用tlbimp创建互操作程序集。然后我将使用Reflector对其进行反编译并将这些源放在一个单独的类库项目中,根据需要修改接口并将此程序集用作interop程序集。

相关问题