Переход от настольного приложения, написанного на C ++, к веб-приложению - PullRequest
5 голосов
/ 14 декабря 2009

У нас есть зрелое настольное приложение для Windows, написанное на C ++. GUI приложения находится поверх библиотеки Windows, которая выполняет большую часть работы над GUI (это своего рода движок). Это тоже написано на C ++. Мы рассматриваем перевод приложения Windows на веб-приложение по разным причинам.

Чего я хотел бы избежать, так это писать CGI для этого веб-приложения на C ++. То есть я бы предпочел использовать язык 4G, такой как Python или .NET, для создания веб-версии этого приложения.

Итак, вопрос таков: учитывая, что мне нужно использовать C ++ DLL на сервере, чтобы выполнить работу приложения, какой технологический стек вы бы порекомендовали для размещения между браузером пользователя и являются ли C ++ DLL? Можно предположить, что веб-сервером будет Windows.

Некоторые опции:

  1. Напишите слой COM поверх библиотеки Windows, к которому затем можно получить доступ через .NET, и используйте ASP.NET для пользовательского интерфейса
  2. Доступ к интерфейсу DLL экспорта напрямую из .NET и использование ASP.NET для пользовательского интерфейса.
  3. Напишите пользовательскую библиотеку Python, которая оборачивает Windows DLL, чтобы можно было написать остальную часть кода.
  4. Напишите CGI, используя C ++ и основанную на C ++ инфраструктуру MVC, например Wt

проблемы:

  • Я бы предпочел не использовать C ++ для веб-фреймворка, если этого можно избежать - я думаю, что такие языки, как Python и C #, просто более мощные и эффективные с точки зрения времени разработки.
  • Я обеспокоен тем, что мой смешанный управляемый и неуправляемый код с одним из решений .NET, я прошу множество небольших проблем, которые трудно отладить (чисто случайное доказательство этого)
  • То же самое верно для использования слоя Python. Все, что немного в глуши, как это, беспокоит меня тем, что у меня не так много доказательств, так или иначе, если это жизнеспособное долгосрочное решение.

Ответы [ 4 ]

10 голосов
/ 14 декабря 2009

Смотрите также Может огромный существующий приложение будет перенесено в сеть? Как?

Извините, что нет хороших решений, просто меньше плохих ....

Во-первых, поскольку вы уже разрабатываете для Windows, я предполагаю, что вы привыкли использовать инструменты разработки Microsoft, я не дал бы тот же ответ для настольного приложения, которое поставляется с Unix (или Mac).

Несколько случайных мыслей и указателей.

  • Я бы использовал Asp.net, скорее всего, Aps.net MVC.
  • Я бы попытался обернуть классы C ++ в какой-нибудь хороший высокоуровневый класс .net, возможно, используя Управляемый C ++ / CLI .
  • Использование COM, вероятно, будет большой работой на стороне C ++ и не облегчает .NET, поэтому я бы избегал COM в пользу управляемого C ++ или pinvoke (Однако, если вы уже используете COM на стороне C ++ , это опция, если вы используете подмножество COM, с которым VB6 может справиться).
  • .NET не может получить доступ ни к одному управляемому объекту C ++, но он может получить доступ к простой функции C с помощью Pinvoke, поэтому, что бы вы ни делали, на сайте C ++ понадобится какой-то мостовой слой.
  • Посмотрите, сможете ли вы использовать Silverlight вместо Интернета, если вы сможете (установить проблемы и т. Д.), Это сэкономит вам много времени на разработку. (И позволяет вам нацеливаться на телефоны Microsoft)
  • Убедитесь, что экономическое обоснование для «порта в Интернет» очень сильное, и это займет намного больше, чем вы думаете! , Хостинг с терминальным сервером и т. Д. Опция для вашего клиенты
  • Подумайте о многопоточности и многопользовательском доступе, например ваш dll предполагает, что он используется только одним пользователем?
  • Только потому, что вы работаете над новой веб-версией, вы по-прежнему будете получать заказчиков, требующих изменений в настольной версии, даже после того, как вы отправили веб-версию. В прошлом я обнаружил, что нынешние клиенты не всегда хотят переходить на веб-приложение.

(Извините, я не знаю совпадений с Python, однако, если у вас еще нет навыков в этом, я бы сказал, придерживайтесь стека Microsoft, поскольку вы уже знаете отладчик Microsoft и т. Д.)


(Я думаю о переносе сложных приложений в Интернет как о очень большой боли , лучше избегать боли, когда это возможно, однако иногда вам не дают выбора и просто приходится свести к минимуму боль . Если вы никогда не работали с большими приложениями, которые находятся в процессе (обычно много лет работы) переноса в Интернет, вы просто не знаете, для чего вы позволяете себе!)

4 голосов
/ 14 декабря 2009

3- Python является решением.

Создайте интерфейс точки входа sigle в python, который принимает только имя функции и список параметров для передачи самой функции. У вас будет что сразу начать экспериментировать и посмотреть, какие функции DLL действительно необходимы для первого функционального веб-прототипа.

Заглушка для одного функционального модуля:

#include <Python.h>
#include <string.h>

int int_function(int a){
    return a +=1;
}

static PyObject *
exec_lib(PyObject *self, PyObject *args)
{
    char *fun_name;
    PyObject *func_name = PyTuple_GetSlice(args, 0,1);
    PyObject *res;

    if (!PyArg_ParseTuple(func_name, "s", &fun_name))
         return NULL;
    Py_DECREF(func_name);
    if (strncmp("int_function", fun_name, 1024) == 0)
    {
        int i;
        PyObject *fun_args = PyTuple_GetSlice(args, 1,20);
        if (!PyArg_ParseTuple(fun_args, "i", &i))
            return NULL;
        Py_DECREF(fun_args);
        res = Py_BuildValue( "i", int_function(i));
    } else {
        Py_INCREF(Py_None);
        res = Py_None;
    }

    return res;
}



PyMethodDef methods[] = {
    {"exec_lib", exec_lib, METH_VARARGS, " Returns"},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC 
initlibwrap()
{
    (void) Py_InitModule("libwrap", methods);
}

может быть скомпилировано с файлом setup.py

from distutils.core import setup, Extension

setup(name = "libwrap",
      version = "1.0",
      ext_modules = [Extension("libwrap", ["my_library_wrap.cpp"])])

и используется на простом веб-сервере, таком как

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import libwrap


def int_function(value):
    return libwrap.exec_lib("int_function", value)

print int_function(10)

class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        value = 'Error'
        try:
            value = int_function()
        except:
            import traceback
            traceback.print_stack()
        self.wfile.write(value)

def main():
    try:
        ip ='localhost'
        port = 8080
        server = HTTPServer((ip,port), MyHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

if __name__ == '__main__':
    main()
2 голосов
/ 14 декабря 2009

Я бы сказал, вариант 2 - это путь. При условии, что вы создадите интерфейс в .Net для вашей DLL, чтобы убедиться, что вы правильно освобождаете свою память и т. Д., Когда это необходимо, я не вижу проблемы. Если вы можете повторно использовать свою бизнес-логику в своей DLL и в основном делать веб-вызов в свою DLL, тогда прекрасно.

Мое единственное беспокойство - API вашей DLL. ASP.Net - это, очевидно, многопоточное многопоточное приложение. Разработан ли ваш API для этого, учитывая, что в большинстве приложений для форм Windows будет только один пользователь, управляющий ими (представьте, что каждая форма в вашем приложении может быть открыта несколькими пользователями одновременно).

1 голос
/ 18 декабря 2009

Так как никто не упомянул об этом, как насчет Wt .

Если вы не ищете пользовательский интерфейс на основе проводника, существует множество библиотек C ++ для расширения локального приложения до веб-приложения, POCO является одним из них. Если вы придерживаетесь платформы Windows, WWSAPI - это действительно здорово для разработчиков на C / C ++.

...