У меня есть сторонний компонент, написанный на C / C ++ (на VS 2010), который можно загрузить здесь .
Этот компонент принимает 3 параметра в качестве входных данных (имя файла и два числа) и выводит результат в консоль, а затем выводит файл.
Я использовал Process и ProcessStartInfo в C #WinForm проект для использования этого компонента, который работает нормально.Однако теперь я хочу использовать это в службе WCF C # RESTful, и в этом случае решение, которое я думал с WinForm, не будет работать.Было предложено вместо этого преобразовать это в MFC DLL и затем использовать InterOp для вызова неуправляемой DLL через мой веб-сервис на C # (другие предложения приветствуются).
К сожалению, я понятия не имею, как это сделатьи мои знания по C / C ++ довольно средние.Итак, мой вопрос: как мне создать DLL из этого компонента, который принимает эти 3 параметра (взятые из main ()):
cin >> fname;
cin >> minA;
cin >> minO;
, затем делает все необходимые вычисления и возвращает это (снова взятоfrom main ()):
cout << "\nNumber is: " << num;
(и, очевидно, по-прежнему выводить файл, который он должен выводить)?
Любая помощь будет высоко оценена.Заранее спасибо!
ОБНОВЛЕНИЕ: Для справки, вот моя реализация WinForm, упомянутая выше.
ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
Process cmdProcess = new Process();
BackgroundWorker BWorker = new BackgroundWorker();
//is able to report progress
BWorker.WorkerReportsProgress = true;
//is able to be cancelled
BWorker.WorkerSupportsCancellation = true;
//attach events
BWorker.DoWork += worker_DoWork;
BWorker.RunWorkerCompleted += worker_RunWorkerCompleted;
BWorker.RunWorkerAsync();
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
if (firstTimeLoaded)
{
cmdStartInfo.FileName = Path.GetFullPath("../../Resources/thirdparty.exe");
cmdStartInfo.WorkingDirectory = Path.GetFullPath("../../Resources/");
cmdStartInfo.RedirectStandardOutput = true;
cmdStartInfo.RedirectStandardError = true;
cmdStartInfo.RedirectStandardInput = true;
cmdStartInfo.UseShellExecute = false;
cmdStartInfo.CreateNoWindow = true;
cmdProcess.StartInfo = cmdStartInfo;
cmdProcess.SynchronizingObject = this;
cmdProcess.ErrorDataReceived += cmd_Error;
cmdProcess.Exited += cmd_Exited;
cmdProcess.EnableRaisingEvents = true;
cmdProcess.Start();
cmdProcess.BeginErrorReadLine();
firstTimeLoaded = false;
}
while (!cmdProcess.HasExited)
{
if (use)
{
if (BWorker.CancellationPending)
{
e.Cancel = true;
}
StringBuilder builder = new StringBuilder();
//read unbuffered output
while (cmdProcess.StandardOutput.Peek() != -1)
{
char inputChar = (char)cmdProcess.StandardOutput.Read();
if (inputChar != '\r' && inputChar != '\n')
{
builder.Append(inputChar);
}
if (inputChar == '\n')
{
break;
}
}
if (cmdProcess.StandardOutput.Peek() == -1)
{
cmdProcess.StandardOutput.DiscardBufferedData();
}
//process the output
string output = builder.ToString();
//determine appropriate action
switch (output)
{
case "Enter file name: ":
cmdProcess.StandardInput.WriteLine(textBox1.Text);
break;
case "Enter minimum size of A: ":
cmdProcess.StandardInput.WriteLine(textBox2.Text);
break;
case "Enter minimum size of O: ":
cmdProcess.StandardInput.WriteLine(textBox3.Text);
break;
}
if (output.Contains("Number: "))
{
MessageBox.Show("Number is: " + output.Substring(output.LastIndexOf(" ") + 1));
use = false;
}
}
}
}