私は、外部データベースアプリケーションへのDLL相互運用機能を使用するC#アプリケーションを開発してきました。
この外部アプリは、C#アプリと同時に起動し、C#アプリが実行されている限り使用できます。
ここで、本当の質問は、外部アプリケーションと対話するために作成する必要のあるオブジェクトの管理に関連しています。
参照されているDLLから利用できるオブジェクトを宣言すると、これらのオブジェクトには、ファイル(プロプライエタリ)を操作し、いくつかのクエリを実行するメソッドがあります(この外部アプリのGUIで実行した場合など)。これらのオブジェクトは、を使用して「自分で」破棄されますがMarshal.ReleaseComObject(A_OBJECT)
、他のオブジェクトは別のアプリケーションドメインで実行され、を使用AppDomain.CreateDomain("A_DOMAIN")
して操作を実行し、を呼び出して、操作にAppDomain.Unload("A_DOMAIN")
使用されたDLLを解放します。
これらの回避策は、この外部アプリケーションがこれらの操作で使用されるファイルを「ブロック」しないようにするために作成されているため、フォルダーからファイルを削除または移動できます。
例えば
private static ClientClass objApp = new ClientClass();
public bool ImportDelimitedFile(
string fileToImport,
string outputFile,
string rdfFile)
{
GENERICIMPORTLib import = new GENERICIMPORTLibClass();
try
{
import.ImportDelimFile(fileToImport, outputFile, 0, "", rdfFile, 0);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(import);
import = null;
}
}
public int DbNumRecs(string file)
{
if (!File.Exists(file))
{
return -1;
}
System.AppDomain newDomain = System.AppDomain.CreateDomain();
COMMONIDEACONTROLSLib db = new COMMONIDEACONTROLSLibClass();
try
{
db = objApp.OpenDatabase(file);
int count = (int)db.Count;
db.Close();
objApp.CloseDatabase(file);
return count;
}
catch (Exception ex)
{
return -1;
}
finally
{
System.AppDomain.Unload(newDomain);
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
私はいかなる種類のAPIマニュアルも持っていないため、これらの「解決策」は両方とも試行錯誤によって達成されました。これらの解決策は正しいですか?違いを説明してもらえますか?私は本当に両方のソリューションで作業する必要がありますか、それとも一方で十分ですか?
ありがとう!