Как передать данные при загрузке программы на C# в exe файл?

Как можно осуществить передачу логина пользователя из PHP скрипта в exe файл, чтобы при его открытии пользователь видел "ваш логин: (логин пользователя)" без необходимости компиляции .cs файла?
  • 16 января 2024 г. 13:40
Ответы на вопрос 2
Есть несколько подходов для передачи данных из PHP скрипта в C# приложение (exe). Вот некоторые из них:

1. **Аргументы командной строки:**
   Можно передать логин пользователя как аргумент командной строки при запуске exe файла. В PHP это выглядит следующим образом:
   ```php
   $login = 'Пользователь123'; // Получаем логин пользователя
   // Запуск exe-файла с аргументом
   exec("путь_к_программе/программа.exe " . escapeshellarg($login));
   ```
   Код на стороне C# для чтения аргументов командной строки:
   ```csharp
   static void Main(string[] args)
   {
       if (args.Length > 0)
       {
           Console.WriteLine($"Ваш логин: {args[0]}");
       }
   }
   ```

2. **Файлы:**
   PHP скрипт может записать данные в файл, а приложение на C# прочитать их оттуда:
   ```php
   $login = 'Пользователь123'; // Получаем логин пользователя
   file_put_contents('login.txt', $login);
   exec("путь_к_программе/программа.exe");
   ```

   Код на стороне C# для чтения из файла:
   ```csharp
   static void Main()
   {
       string login = File.ReadAllText("login.txt");
       Console.WriteLine($"Ваш логин: {login}");
   }
   ```

3. **Сетевое взаимодействие:**
   Можно создать простое сетевое взаимодействие, в котором PHP будет отправлять данные на C# сервер.

   Пример PHP клиента:
   ```php
   $login = 'Пользователь123';
   $fp = fsockopen("tcp://127.0.0.1", 12345, $errno, $errstr, 30);
   if (!$fp) {
       echo "$errstr ($errno)<br />\n";
   } else {
       fwrite($fp, $login);
       fclose($fp);
   }
   ```

   Пример C# сервера:
   ```csharp
   static void Main()
   {
       TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 12345);
       server.Start();
       Console.WriteLine("Ожидание подключений...");
       TcpClient client = server.AcceptTcpClient();
   
       using (NetworkStream stream = client.GetStream())
       using (StreamReader reader = new StreamReader(stream))
       {
           string login = reader.ReadLine();
           Console.WriteLine($"Ваш логин: {login}");
       }
   
       server.Stop();
   }
   ```

4. **Среда (Environment Variables):**
   Используйте переменные среды для передачи информации между скриптами.

   Пример PHP:
   ```php
   $login = 'Пользователь123';
   putenv("USER_LOGIN=$login");
   exec("путь_к_программе/программа.exe");
   ```

   Пример C#:
   ```csharp
   static void Main()
   {
       string login = Environment.GetEnvironmentVariable("USER_LOGIN");
       Console.WriteLine($"Ваш логин: {login}");
   }
   ```

Какой способ выбрать зависит от конкретных требований и настроек вашего приложения. Первый способ с аргументами командной строки является одним из самых простых и часто используемых.
1. Передавать имя пользователя в аргументах к программе, но тогда нужно уметь правильно запускать. Т.е. нужен установщик, который ярлык правильно настроит 
2. Отправлять вместе с программой файл конфигурации, из которого нужно читать имя пользователя.
3. Скомпилировать с уже встроенным именем.

Для последнего пункта можно сделать оптимизацию - весь проект (с логикой) хранить уже скопилированными, а при поступлении запроса компилировать exe. В него положить имя пользователя и просто скопировать готовые dll, а сам он просто будет прослойкой для самой программы.

Также появилась идея о каком-нибудь шаблонном движке (по типу razor), который в потоковой обработке будет отправлять байты программы и в нужном месте подставит строку имени, но не знаю существует такое решение или нет (скорее нет)
Похожие вопросы