Вызов и подключение программы на c++ из c#

443
08 июля 2017, 07:18

Есть программа на c++, которая генерирует зашифрованное сообщение и выводит в файл и консоль. Программа на c# должна эти данные выводить на winforms. Как их вообще связать? Т.е. вызвать шифратор сообщения на с++ из c#, подождать пока она посчитает и выведет данные, а затем на с# в winforms выведет ответ?

Answer 1

Лучше переделать программу на C++ в dll, подключить его и из C# вызать соответствующий метод.

C++

  1. Запускаем Visual Studio .NET.
  2. Создаём новый проект File->New->Project.
  3. Выбираем Visual C++ Project, На вкладке Templates->Visual C++, Выбираем “Win32 Project”.
  4. Выбираем имя для проекта, например TestLib. Нажимаем OK.
  5. В следующей форме выбираем Application Type: DLL и Empty Project.
  6. Добавим в "Source File" New Item->C++ File.
  7. Добавим код

    #include <stdio.h>
    extern "C"
    {
      double __declspec(dllexport) Add (double a, double b)
      {
        return a + b;
      }
    }
  8. Компилируем.

C#

using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        [DllImport("TestLib.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern double Add(double a, double b);
        private void button1_Click(object sender, EventArgs e)
        {
            var x = Add(25, 17);
            MessageBox.Show(x.ToString());
        }
    }
}
Answer 2

Есть вариант запустить консольное приложение из C# и считать вывод.

 Process p = new Process();
 p.StartInfo.UseShellExecute = false;
 // Перехватываем вывод
 p.StartInfo.RedirectStandardOutput = true;
 // Запускаемое приложение
 p.StartInfo.FileName = "example.exe";
 // Передаем необходимые аргументы
 // p.Arguments = "example.txt";
 p.Start();
 // Результат работы консольного приложения
 string output = p.StandardOutput.ReadToEnd();
 // Дождаться завершения запущенного приложения
 p.WaitForExit();

Информация взята из MSDN и ответов.

READ ALSO
Entity и Value object на основе одного класса

Entity и Value object на основе одного класса

Скажите, пожалуйста, в рамках подхода DDD, является ли корректным рассматривать один и тот же класс как Entity и как Value object

250
Иконка из DirectoryEntry по типу объекта

Иконка из DirectoryEntry по типу объекта

Реально ли получить иконку из ресурсов Windows по типу объекта из DirectoryEntry?

257
Как в Unity3d использовать возможности C# 5/6/7?

Как в Unity3d использовать возможности C# 5/6/7?

Захотел я идти в ногу со временем, посмотрел новые фишки и плюшки C#6/7, воодушевилсяТам так всё вкусно и круто, что грех не пользоваться

417