アンマネージド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とは異なる)これに対してよりよいアプローチは何ですか?
ありがとうございました。
うーん... :) ...あなたのアドバイスに従うことをしようが、必要なすべての属性を「推測」することは容易ではない本当のインポート方法は次のようになります。 [DLLIMPORT(「Library.dll」)] (string []);文字列fileLines、int linesCount、文字列filePath、int someIntValue、参照文字列errorMsg、参照int refIntValue、参照文字列refStringValue); string []に対してUnmanagedType.LPArrayを使用し、stringおよびref文字列でUnmanagedType.LPStrを使用しようとしました。何も悪くなく、何も良くなっていない:)。正しい属性で助けてください。 – Alex
@Alex:管理されていない署名を投稿する –
Mehrdadが言ったように、署名が役立つでしょう。あなたはコールバックや他の関数呼び出しのような何かをラッピングしていますか? –