Корпус:
Существует приложение .net, вызывающее неуправляемый C-код. Используемый метод для этого:
public static class MiracleCreator
{
[DllImport("Library.dll")]
private static extern void RunUnmanaged(string fileName);
public static void Run(string fileName)
{
RunUnmanaged(fileName);
}
}
Он используется в приложении Windows Forms, и необходимое имя файла получается с помощью OpenFileDialog. Код:
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
MiracleCreator.Run(openFileDialog.FileName);
}
Проблема:
После нескольких выполнений кода в приложении Windows Forms openFileDialog прерывается с исключением: "Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена."
В поисках решения:
Попытка «более надежного» использования OpenFileDialog не помогает. Понравилось это решение (попытался дать ссылку, но «новым пользователям запрещено добавлять гиперссылки» :)):
public class Invoker
{
public OpenFileDialog InvokeDialog;
private Thread InvokeThread;
private DialogResult InvokeResult;
public Invoker()
{
InvokeDialog = new OpenFileDialog();
InvokeThread = new Thread(new ThreadStart(InvokeMethod));
InvokeThread.SetApartmentState(ApartmentState.STA);
InvokeResult = DialogResult.None;
}
public DialogResult Invoke()
{
InvokeThread.Start();
InvokeThread.Join();
return InvokeResult;
}
private void InvokeMethod()
{
InvokeResult = InvokeDialog.ShowDialog();
}
}
Использование:
Invoker I = new Invoker();
if (I.Invoke() == DialogResult.OK)
{
MessageBox.Show(I.InvokeDialog.FileName, "Test Successful.");
}
else
{
MessageBox.Show("Test Failed.");
}
Вопросы:
Действительно ли исключение вызвано неуправляемым кодом? Можно ли ожидать других возможных проблем (что-то отличное от OpenFileDialog)? Какой подход лучше для этого?
Спасибо за каждую идею / решение.