案子:
有一个 .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 不同的东西)?对此有什么更好的方法?
感谢您的每一个想法/解决方案。