2011-06-15 70 views
2

我们使用NET的第三方COM API。目前Visual Studio &大概TLBIMP用于生成Interop包装DLL。我可以更改Visual Studio生成的COM Interop方法的签名吗?

提供给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并希望以一种模糊的方式处理它。

这是步骤2 & 3我想避免。我无法改变第三方API处理明文密码的事实,但我希望至少可以控制我们控制的代码,以尽量减少内存中明文的存在。

我想更改NET方法的签名以获取SecureString而不是String - NET已经可以将SecureString封送到BSTR,因此COM互操作代码仍然可以将相同的数据呈现给实际的COM API,但没有创建String的可怕步骤。这可以做到吗?

回答

1

是的,但您需要手动编写interop接口的代码,然后您可以根据需要更改参数的类型。

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

相关问题