2

ケース:

アンマネージ C コードを呼び出す .net アプリケーションがあります。これに使用される方法:

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

SaveFileDialog.NET Windows フォーム アプリケーション (Windows 7 32 ビットで実行) でマネージ コードを使用して同じエラーが発生するのsaveAsは、db からロードされたデータを含むモーダル フォームから を公開する場合のみです。何時間ものデバッグと試行錯誤の後、私の目は以前はそこにあったとは知らなかったプロパティに気づきました: VB.NET で、私は書いた

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

そしてエラーは消えました。

于 2011-03-09T15:45:59.153 に答える