2013-07-26 1 views
3

Я работаю над обеспечением надежного взаимодействия .NET для некоторого программного обеспечения с неуправляемым API через COM для сторонних разработчиков..NET справиться с добавлением необязательных параметров к неуправляемому API

Ранее программное обеспечение поддерживало только VBScript для сторонних разработчиков, и из-за этого они привыкли к тому, что могут добавлять новые методы и необязательные параметры для устранения проблем с функциональностью API.

В .NET однако добавление необязательного параметра представляет собой разрывное изменение (по мере изменения сигнатуры метода). Если API был в .NET, это можно легко решить, используя перегруженные методы, однако, поскольку API неуправляемый, мы используем COM-интерфейс, и поэтому я не могу использовать перегрузки.

У меня нет какого-либо влияния политики изменения API

Вещей Я рассмотрел, но не получить в любом месте с:

  • с помощью отражения Выделяет добавить перегрузки во время выполнения - Насколько я вижу, это может быть сделано только в том случае, если я динамически создаю весь комплект; и может оказаться невозможным, учитывая, что API - это typelib/COM, а не настоящая сборка .NET.

  • Поймайте и перенаправлять вызывать ошибки - Если необязательный параметр «хит» ошибка имеет всю информацию, необходимую для перенаправления старого метода в новом с дополнительным параметром. К сожалению, я понимаю, что после того, как ошибка будет сброшена, вы не сможете вернуться.

  • Обертка typelib - Я буду знать заранее, когда API-метод имеет дополнительный параметр. Поэтому я посмотрел, могу ли я как-то добавить перегрузку в typelib или, возможно, обернуть весь typelib в .NET-прокси с перегруженными методами, включенными для перехода между методами pre-/post-optional. Но если это можно сделать, я действительно не могу найти способ сделать это.

Все предложения приветствуются - я становлюсь довольно отчаянным здесь!

n.b. .NET отлично подходит для добавления новых методов, это просто добавление необязательных параметров, которые вызывают у меня проблемы. Кроме того, я пишу в VB.NET, но с радостью могу использовать код на C# и т. Д., Если это упростит ситуацию.

+0

На самом деле это не моя область знаний, но не взаимодействует ли Office с дополнительными параметрами в их API? Вы можете посмотреть, как они справляются с этим. –

+0

Офис PIA имеет гораздо больше ресурсов, чем я, и предоставляет другую сборку для каждой версии Office, которую они поддерживают. Я сомневаюсь, что смогу обойтись без потери тех маленьких волос, которые у меня есть! – thomasmichaelwallace

+0

У меня есть проект У меня есть неуправляемый код C++ с надежным массивом вариантов, которые мне нужно объединить с vb.net. Первоначально использовался vbscript.Я даже не могу написать оболочку C++, потому что я не знаю, как инициализировать saferyray, чтобы иметь fFeatures из 2194, так что com-код работает. Надейтесь, что вы не в одном из этих сценариев с безопасным набором вариантов (вам нужно быстро уйти после решения проблемы). Я почти напишу в C# все, что требует варианта, или напишет собственную оболочку C++. Жаль, что вы не указали ни один код, который мне бы помог. – jeffery

ответ

1

Попробуйте объявить функцию один раз для каждой конфигурации параметров, используя ключевое слово Alias.

Declare Function functionName1 Lib "libName" Alias "libFunctionName" (parameter configuration 1) 
Declare Function functionName2 Lib "libName" Alias "libFunctionName" (parameter configuration 2) 
... 

Затем вызовите соответствующую функцию на основе параметров, используемых в вызове.

+0

Я думаю, что если бы я сделал это, мне нужно было бы либо авторизовать всю типологию вручную, либо использовать Tlbimp, а затем объявлять функции в IL. Однако, чтобы получить то, что мне нужно, functionName1 и functionName2 должны быть одинаковыми; или же оригинальный API мог бы просто добавить новую функцию, сохранив некоторое время. Это то, о чем я не думал, так что, возможно, это подтолкнет меня в правильном направлении - спасибо @xpda. – thomasmichaelwallace

 Смежные вопросы

  • Нет связанных вопросов^_^