Как записать c# сервис, который я могу также выполнить как программа winforms?

box_id не является массивом. Сделайте это строкой и добавьте к ней i.

for (i=1; i<=10; i++) {
    
     document.getElementById('box_id'+i).value = "12345";
}
<td class="dedefault">
<input type="hidden" name="RSTS_IN" value="RW">
<label for="box_id1"><span class="fieldlabeltextinvisible">BOX</span></label>
<input type="text" name="ID_IN" size="6" maxlength="5" id="box_id1"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id2"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id3"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id4"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id5"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id6"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id7"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id8"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id9"/><input type="text" name="ID_IN" size="6" maxlength="5" id="box_id10"/>
</td>

7
задан Community 23 May 2017 в 10:27
поделиться

11 ответов

У Вас в основном есть два варианта. Или выставьте API на сервисе, который можно затем назвать из приложения UI ИЛИ позволить сервису работать или как приложение winforms или как сервис.

Первая опция довольно легка - дистанционная работа использования или WCF для представления API.

Вторая опция может быть достигнута путем перемещения "кишок" приложения в отдельный класс, затем создают сервисную обертку и обертку форм победы что оба вызова в класс "кишок".

static void Main(string[] args)
{
    Guts guts = new Guts();

    if (runWinForms)
    {
        System.Windows.Forms.Application.EnableVisualStyles();
        System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);

        FormWrapper fw = new FormWrapper(guts);

        System.Windows.Forms.Application.Run(fw);
    }
    else
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new ServiceWrapper(guts) };
        ServiceBase.Run(ServicesToRun);
    }
}
17
ответ дан 6 December 2019 в 07:53
поделиться

Создайте новое приложение winforms ссылки блок Вашего сервиса.

2
ответ дан 6 December 2019 в 07:53
поделиться

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

Самая важная покрытая вещь состоит в том, как надежно определить, работаем ли мы в интерактивном режиме или через сервис.

1
ответ дан 6 December 2019 в 07:53
поделиться

Если Вы используете ниже кода:

[DllImport("advapi32.dll", CharSet=CharSet.Unicode)]
static extern bool StartServiceCtrlDispatcher(IntPtr services);
[DllImport("ntdll.dll", EntryPoint="RtlZeroMemory")]
static extern void ZeroMemory(IntPtr destination, int length);

static bool StartService(){
    MySvc svc = new MySvc(); // replace "MySvc" with your service name, of course
    typeof(ServiceBase).InvokeMember("Initialize", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
        null, svc, new object[]{false});
    object entry = typeof(ServiceBase).InvokeMember("GetEntry",
        BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, svc, null);
    int len = Marshal.SizeOf(entry) * 2;
    IntPtr memory = Marshal.AllocHGlobal(len);
    ZeroMemory(memory, len);
    Marshal.StructureToPtr(entry, memory, false);
    return StartServiceCtrlDispatcher(memory);
}

[STAThread]
static void Main(){
    if(StartService())
        return;

    Application.Run(new MainWnd()); // replace "MainWnd" with whatever your main window is called
}

Затем Ваш EXE будет работать как любой сервис (если запущено SCM) или как GUI (если запущено любым другим процессом).

По существу все, что я сделал здесь, является используемым Отражателем для выяснения что суть ServiceBase.Run делает и копируют его здесь (отражение требуется, потому что это называет закрытые методы). Причина того, чтобы не звонить ServiceBase.Run непосредственно то, что это открывается окно сообщения, чтобы сказать пользователю, что сервис не может быть запущен (если не запущенный SCM), и не возвращает ничего, чтобы сказать коду, что сервис не может быть запущен.

Поскольку это использует отражение для вызова частных методов платформы, оно не может функционировать правильно в будущих изменениях платформы. Кодер Caveat.

2
ответ дан 6 December 2019 в 07:53
поделиться

Существует также FireDaemon. Это позволяет Вам запускать любое приложение Windows как услуга.

1
ответ дан 6 December 2019 в 07:53
поделиться

необходимо реализовать отдельный процесс, который может общаться с сервисом. В то время как возможно на XP и более ранних системах иметь сервис, показывающий UI, это больше не возможно на Vista и позже.

0
ответ дан 6 December 2019 в 07:53
поделиться

Другая возможность НЕ состоит в том, чтобы использовать сервис, но использовать приложение, которое находится в Панели задач (думайте Roxio Drag-to-Disc, и скорее всего Ваши жизни Антивирусного программного обеспечения там), который имеет значок вниз часами, которые запускают меню, когда по этому щелкают правой кнопкой, и UI когда дважды щелкнувший.

0
ответ дан 6 December 2019 в 07:53
поделиться

Если Ваш сервис модулируется правильно, Вы могли бы разместить сервис или в исполняемом файле как услуга, или с исполняемым файлом с gui для теста. Мы используем этот метод с нашим сервисом также, автономный сервисный исполняемый файл размещает сервис в продуктивной среде, но у нас есть консольное приложение для хостинга сервиса, также.

0
ответ дан 6 December 2019 в 07:53
поделиться

Разделите свой код на различные компоненты: один компонент для управления сервисными аспектами и один для выполнения фактической бизнес-логики. Создайте и взаимодействуйте с бизнес-логикой от сервисного компонента. Для тестирования (Вашей бизнес-логики) можно создать WinForm или консольное приложение, которое использует компонент бизнес-логики без сервисного компонента. Еще лучше используйте платформу поблочного тестирования для объема Вашего тестирования. Многие методы в сервисном компоненте, несомненно, будут единицей, тестируемой также.

0
ответ дан 6 December 2019 в 07:53
поделиться

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

0
ответ дан 6 December 2019 в 07:53
поделиться

Если Вы инкапсулируете свою бизнес-логику в обслуживании классы и затем используете шаблон "фабрика" для создания тех сервисов, можно использовать тот же набор сервисов для настольного приложения (настольная фабрика) и как веб-сервисы (хост в WCF).

Сервисное определение:

[ServiceContract]
public interface IYourBusinessService
{
    [OperationContract]
    void DoWork();
}

public class YourBusinessService : IYourBusinessService
{
    public void DoWork()
    {
        //do some business logic here
    }

}

Фабрика для настольного WinForms для достигания сервисов для ведения бизнеса:

public class ServiceFactory
{
    public static IYourBusinessService GetService()
    {
        //you can set any addition info here
        //like connection string for db, etc.
        return new YourBusinessService();
    }
}

Вы размещаете это или с классом WCF ServiceHost, или в IIS. Оба позволяют Вам способность указать, как инстанцировать каждого экземпляра сервиса так, чтобы можно было сделать инициализацию как строки подключения и т.д.

0
ответ дан 6 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: