2009-05-30 6 views
2

ケース:.NETでアンマネージコードを使用する

アンマネージド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を除いて壊れますFormsアプリケーション:は、「保護されたメモリを読み書きしようとしました。これは、多くの場合、その兆候です。他のメモリが壊れています。解決策を探して

: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とは異なる)これに対してよりよいアプローチは何ですか?

ありがとうございました。

答えて

1

メソッド宣言のstringパラメータには、適切なMarshalAs属性を指定する必要があります。以下のようなもの:.NET Windowsでマネージコードを介しSaveFileDialogを用い

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

うーん... :) ...あなたのアドバイスに従うことをしようが、必要なすべての属性を「推測」することは容易ではない本当のインポート方法は次のようになります。 [DLLIMPORT(「Library.dll」)] (string []);文字列fileLines、int linesCount、文字列filePath、int someIntValue、参照文字列errorMsg、参照int refIntValue、参照文字列refStringValue); string []に対してUnmanagedType.LPArrayを使用し、stringおよびref文字列でUnmanagedType.LPStrを使用しようとしました。何も悪くなく、何も良くなっていない:)。正しい属性で助けてください。 – Alex

+0

@Alex:管理されていない署名を投稿する –

+0

Mehrdadが言ったように、署名が役立つでしょう。あなたはコールバックや他の関数呼び出しのような何かをラッピングしていますか? –

0

同じerrrorは、DBからロードされた任意のデータを用いてモーダルフォームからsaveAsを露光する場合にのみ(Windows 7の32ビット上で実行されている)フォームアプリケーション。 VB.NETで、私は

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

を書いて、エラーが消えた:醜いデバッグの時間と裁判/エラーの後、私の目は、私が前にあったことに気づかなかったプロパティに落ちました。

関連する問題