Могу ли я изменить сигнатуру метода COM Interop от сигнатуры, созданной Visual Studio? - PullRequest
2 голосов
/ 15 июня 2011

Мы используем сторонний COM API от NET. В настоящее время Visual Studio и, предположительно, TLBIMP используются для создания DLL-оболочки 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 , но без ужасного шага создания строки. Можно ли это сделать?

1 Ответ

1 голос
/ 10 сентября 2011

Да, но вам нужно вручную написать код для интерфейса взаимодействия, а затем, конечно, вы можете изменить тип параметров по своему усмотрению.

Я бы, вероятно, начал с создания сборки взаимодействия с использованием tlbimp. Затем я декомпилирую его с помощью Reflector и помещаю эти источники в отдельный проект библиотеки классов, изменяя интерфейс по мере необходимости, и использую эту сборку в качестве сборки взаимодействия.

...