案例:使用非托管代码.net
有一个.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代码的几个处决后窗体应用程序的打开文件对话框获取与例外破:“试图读取或写入保护内存这通常是一个迹象表明,其他内存已损坏。“
在寻找解决方案:
试图“更可靠”的使用打开文件对话框中没有帮助。这样的解决方案(试图给的链接,但 “新用户不允许添加超链接” :)):
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不同的东西)?有什么更好的方法呢?
谢谢你的每一个想法/解决方案。
嗯...试图按照你的建议,但它是不容易的“猜测”所有需要的属性... :) 真正进口的方法是这样的: 函数[DllImport(“Library.dll”) private static extern int Run(string [] fileLines,int linesCount,string filePath,int someIntValue,ref string errorMsg,ref int refIntValue,ref string refStringValue); 试图使用UnmanagedType.LPArray作为string []和UnmanagedType.LPStr作为字符串和ref字符串。没有更糟糕的事情,没有更好的:)。请帮助正确的属性。 – Alex 2009-05-30 11:37:34