2009-11-17 3 views
2

У меня есть старые C 32-разрядные библиотеки DLL, которые используют библиотеку предварительного компилятора Pro Pro (proc.exe), чтобы выставить сотню звонков sproc/func на еще более старый графический интерфейс VB6, который ссылается эти функции через явные заявления Declare, как так:Преобразование C (не C++) в C#

Declare Function ConnectToDB Lib "C:\windows\system32\EXTRACT32.DLL" (CXN As CXNdets, ERR As ERRdets) As Long 

Все структуры в заголовочных файлах C кропотливыми воспроизведены в конце VB6 фронта. По крайней мере SQL предварительно скомпилирован.

Вопрос в том, стоит ли пытаться наложить интерфейс .Net (путем преобразования на сборку) на код C и обновить VB6 до C#, или вы думаете, что я должен просто отказаться от всего этого и начать с царапина. Как всегда, время имеет существенное значение, поэтому мое обращение к предыдущему опыту. Я знаю, что если я сохраню декларации в .Net, мне придется добавить много сложных украшающих украшений, которых я бы хотел избежать.

Мне никогда не приходилось конвертировать C в .Net до того, как мой основной вопрос, если все остальное игнорируется, есть ли ограничения портирования, которые делают это нецелесообразным?

+2

Вы также можете пойти «на полпути» и использование C++/CLI. –

+0

Я подумал об этом, но на самом деле этого недостаточно, чтобы сделать его достойным дополнительного времени. Кэнты, ожидающие этого, уже на моей спине для изменений, которые я предполагаю внедрить, но вы знаете, когда видите кусок sh1t, который вы не можете помочь, но хотите немного отполировать его. – MaSuGaNa

ответ

3

... Как минимум SQL предварительно скомпилирован.

Это единственная причина, по которой у вас есть код в C? Если это так, мой совет состоит в том, чтобы отказаться от этого и просто переписать все на C# (или даже VB6, если это то, что написано в вашем приложении) ... если вы не профилировали его и не можете доказать измеримую разницу, вы не будете получить любую первичную выгоду от вызовов sql/sproc в C. Вы получите только повышенные затраты на обслуживание из-за сложности необходимости поддерживать этот мост взаимодействия.

+0

Там нет большого количества финансовых расчетов по ценным бумагам, хотя я беру вашу точку зрения о разделении SQL. Он не предназначен для поддержки. Любые изменения в интерфейсе должны быть пропущены до конца. – MaSuGaNa

+1

Переписывание всегда внешне привлекательно - новый код будет намного лучше! - и часто очень рискованно. – MarkJ

2

Вы должны продолжить использовать DLL в .NET, создав сборку вокруг объявления. Вероятно, эта сборка пойдет быстрее на VB.NET, чем на C#. Затем укажите свой новый интерфейс для сборки. После этого вы купили себе время, чтобы преобразовать код C в .NET. Вы делаете это, сначала сохраняя сборку и заменяя объявления новым кодом .NET. Скоро вы замените все и сможете реорганизовать его на другой дизайн.

Время-убийца нарушение поведения. Чем ближе вы сможете сохранить поведение исходного приложения, тем быстрее будет преобразование. Помните, что нет ничего плохого в ссылке на традиционную DLL. .NET построен на многих уровнях API, которые в конечном счете сводятся к традиционным DLL, которые продолжают использоваться Windows. Опять же, как только вы работаете с .NET UI, у вас есть больше времени для работы над ядром и переноса всего на .NET.

+1

+1. Любой достойный инструмент обновления (подсказка - не от Microsoft) будет сортировать операторы 'Declare' для вас одним нажатием кнопки. В другой раз убийца * тестирует, что вы не нарушили поведение *. Я считаю, что это основные усилия на крупных конверсионных рабочих местах. – MarkJ

1

I always advise extreme caution перед тем, как переписывать что-либо. Если вы используете decent tool для обновления VB6 до .NET, он автоматически преобразует операторы Declare, поэтому не стесняйтесь их слишком много!

Это обычная ошибка, чтобы начать оптимистично переписывать большое количество программного обеспечения, сделать хороший ранний прогресс, исправляя некоторые из известных недостатков старой архитектуры, а затем увязнуть в функциональности, которую вы только что принимая само собой разумеющееся в течение многих лет. На этом этапе ваше управление начинает нервничать, и все может стать очень неудобным. Я был там, и это не весело. Похоже, ваши пользователи уже twitchy, что является плохим знаком.

...и вот пост в блоге на Microsofty что agrees with me:

Многие компании я работал в первые дни .NET первый посмотрел на перезапись частично вызвано сильным желанием улучшить базовую архитектуру и кодовые структуры на одновременно с переходом на .NET. К сожалению, многие из этих проектов столкнулись с трудностями, и некоторые из них никогда не были завершены. Проблема, которую они пытаются решить слишком большой

... и некоторые official advice from Microsoft UK о миграции с VB6 на .NET

Выполнение полностью переписан для .NET является гораздо более дорогостоящим и трудным сделать хорошо [чем преобразование] ... мы бы рекомендовали этот подход только для небольшого числа ситуаций.

Возможно, ваша программа небольшая, и у вас есть отличное понимание проблем, которые она решает, и вы отлично разбираетесь в точности и сохраняете свои проекты на ходу, и все будет хорошо.

+0

+1 Спасибо, что Марк загрузил конвертер ArtinSoft для просмотра. – MaSuGaNa

1

Если вы перейдете с VB6 на VB.net или C#, выбросьте код C и используйте соответствующие классы ODP.net или LINQ для доступа к этим хранимым процедурам. Поскольку уровень C (как я понимаю) не имеет никакой логики, кроме раскрытия хранимых процедур, после переключения не будет полезен. Делая это, вы получите обработку (по крайней мере) намного лучше исключения (то есть исключения вообще вместо магических кодов возврата), ремонтопригодность и т.д.

Смотрите также: Automatically create C# wrapper classes around stored procedures

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