我一直在開發使用DLL互操作到外部數據庫應用程序C#應用程序。C#-My應用和Interopability(DLL/COM)與外部應用程序
這種外部應用程序在同一時間與我的C#應用程序一起啓動,可只要我的C#應用程序正在運行。
現在真正的問題是有關管理,我需要建立與外部應用程序交互的對象。
當我宣佈,可從引用的DLL的這些對象有與文件(即是私有的)操作方法的對象和運行一些查詢(例如,如果通過這個外部應用程序GUI做到了)。這些對象被銷燬「由我」使用Marshal.ReleaseComObject(A_OBJECT)
而其他在diferent應用程序域中運行,通過使用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手冊。這些方案是否正確?你能解釋我的差異嗎?我真的需要使用這兩種解決方案還是應該足夠?
謝謝!
謝謝,我將嘗試@James發佈的解決方案,我認爲它對我的目的更清潔。謝謝 – Libas 2011-05-25 08:17:03