2009-05-30 104 views
2

案例:使用非托管代码.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不同的东西)?有什么更好的方法呢?

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

回答

1

您应该为方法声明的string参数指定适当的MarshalAs属性。喜欢的东西:

[DllImport("Library.dll")] 
private static extern void RunUnmanaged(
    [MarshalAs(UnmanagedType. ...)] string fileName); 
+0

嗯...试图按照你的建议,但它是不容易的“猜测”所有需要的属性... :) 真正进口的方法是这样的: 函数[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

0

经由在.NET视窗托管代码使用SaveFileDialog相同errror窗体应用程序从一个模态形式与来自分贝加载的任何数据露出saveAs仅当(在Windows 7 32位运行)。丑陋小时的调试和试/错误之后,我的目光落在我没有意识到的是有一个属性之前:在VB.NET,我写

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

和错误消失。