2

案子:

有一个 .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 窗体应用程序,所需的文件名由 OpenFileDialog 获得。代码:

if (openFileDialog.ShowDialog() == DialogResult.OK)
{
    MiracleCreator.Run(openFileDialog.FileName);
}

问题:

在 Windows 窗体应用程序中多次执行代码后,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 不同的东西)?对此有什么更好的方法?

感谢您的每一个想法/解决方案。

4

2 回答 2

1

您应该为方法声明的参数指定适当的MarshalAs属性。string就像是:

[DllImport("Library.dll")]
private static extern void RunUnmanaged(
  [MarshalAs(UnmanagedType. ... )] string fileName);
于 2009-05-30T08:07:37.443 回答
0

仅当使用从 db 加载的任何数据从模态表单SaveFileDialog公开时,通过 .NET Windows 窗体应用程序(在 Windows 7 32 位上运行)中的托管代码使用相同的错误。saveAs经过几个小时的调试和试错后,我的目光落在了一个我以前没有意识到的属性上:在 VB.NET 中,我写了

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

错误消失了。

于 2011-03-09T15:45:59.153 回答