Использование неуправляемого кода в .net - PullRequest
2 голосов
/ 30 мая 2009

Корпус:

Существует приложение .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)? Какой подход лучше для этого?

Спасибо за каждую идею / решение.

Ответы [ 2 ]

1 голос
/ 30 мая 2009

Вы должны указать соответствующий атрибут MarshalAs для параметра string объявления метода. Что-то вроде:

[DllImport("Library.dll")]
private static extern void RunUnmanaged(
  [MarshalAs(UnmanagedType. ... )] string fileName);
0 голосов
/ 09 марта 2011

Та же ошибка при использовании SaveFileDialog через управляемый код в приложении .NET Windows Forms (работает в Windows 7 32-разрядная версия) только при отображении saveAs из модальной формы с любыми данными, загруженными из БД. После уродливых часов отладки и проб / ошибок мои глаза упали на свойство, которое я не осознавал, было там раньше: в VB.NET я написал

Dim sfv As New System.Windows.Forms.SaveFileDialog
   With sfv  
     .AutoUpgradeEnabled = False
     '[...] 

и ошибка исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...